HTTP 304 Not Modified: symulacja żądanie po żądaniu
HTTP 304 Not Modified
HTTP 304 Not Modified: ETag i If-None-Match wyjaśnione | We.Inc
Zasymuluj żądanie warunkowe: ustaw ETag i Last-Modified serwera oraz If-None-Match i If-Modified-Since przeglądarki i zobacz 304 lub 200 wraz z powodem.
Odpowiedź 304 Not Modified mówi przeglądarce, że jej kopia w cache jest nadal aktualna, więc serwer nie wysyła ponownie treści. Jest to odpowiedź na warunkowe GET lub HEAD z nagłówkiem If-None-Match lub If-Modified-Since. 304 to dobra wiadomość, a nie błąd: oszczędza transfer, a plik z cache jest dalej używany.
Pary walidatorów stojące za 304
Serwer wysyła
Przeglądarka odsyła
Serwer odpowiada 304, gdy
ETag: "v2"
If-None-Match: "v2"
Jeden z podanych tagów pasuje do bieżącego ETag (porównanie słabe)
Last-Modified: <date>
If-Modified-Since: <date>
Zasób nie zmienił się od tej daty
Oba
Oba
Decyduje If-None-Match; If-Modified-Since jest ignorowany
Wpisz, co serwer ma obecnie i co wysyła przeglądarka, a symulator zastosuje reguły pierwszeństwa ze specyfikacji HTTP. Pokaże status, który powinien zwrócić serwer, i nagłówek, który o nim zdecydował. Wyczyść pole, aby pominąć dany nagłówek.
Ustaw wartości ETag i Last-Modified, które serwer ma teraz dla pliku.
Ustaw nagłówki If-None-Match i If-Modified-Since, które przeglądarka wysyła ze swojego cache.
Przeczytaj status i powód: który nagłówek został sprawdzony i dlaczego pasował lub nie.
Zmień ETag serwera, aby zobaczyć, jak wdrożenie zamienia następne żądanie w 200.
Odpowiedź 304 musi powtarzać nagłówki, które miałaby odpowiedź 200, takie jak Cache-Control, ETag, Vary i Date, aby cache mógł odświeżyć zapisane metadane.
Nazwy zasobów z odciskiem, takie jak app.3f9a1c.js, w połączeniu z długim max-age całkowicie eliminują rewalidację. Rewalidację przez ETag zostaw dla HTML i odpowiedzi API.
Słabe ETagi zaczynają się od W/ i obiecują równoważność semantyczną, a nie identyczność bajtów. Nadal działają z If-None-Match, bo ten nagłówek używa porównania słabego.
W DevTools wiersz 304 z małym rozmiarem transferu oznacza udaną rewalidację przez przeglądarkę. Podczas debugowania wyłącz cache w panelu Network, aby wymusić pełne odpowiedzi 200.
Najczęściej zadawane pytania
Czy odpowiedź 304 to błąd?
Nie. To status z klasy przekierowań, oznaczający, że można użyć kopii z cache. Przeglądarka pokazuje stronę ze swojego cache, a przez sieć przeszły tylko nagłówki.
Czy odpowiedź 304 może mieć treść?
Nie. Specyfikacja mówi, że odpowiedź 304 kończy się na końcu sekcji nagłówków i nie może zawierać treści.
Co wygrywa: If-None-Match czy If-Modified-Since?
If-None-Match. Gdy żądanie zawiera oba, serwer obsługujący tagi encji sprawdza If-None-Match i ignoruje If-Modified-Since, bo tagi wykrywają zmiany, których nie wykryje data z dokładnością do sekundy.
Dlaczego po każdym wdrożeniu dostaję 200 zamiast 304?
Wdrożenie zmieniło plik lub jego ETag, więc tag przechowywany przez przeglądarkę już nie pasuje. To poprawne zachowanie. Jeśli niezmienione pliki też tracą 304, sprawdź, czy Twoje serwery nie generują różnych ETagów dla tej samej treści.
Czy POST kiedykolwiek zwraca 304?
Nie. If-None-Match i If-Modified-Since dają 304 tylko dla GET i HEAD. Dla innych metod niespełniony warunek daje 412 Precondition Failed.
Jak działa rewalidacja
Gdy odpowiedź w cache staje się nieaktualna, przeglądarka jej nie wyrzuca. Pyta serwer, czy jej kopia jest nadal dobra, wysyłając zapisane walidatory: ETag jako If-None-Match i datę Last-Modified jako If-Modified-Since.
Jeśli nic się nie zmieniło, serwer odpowiada 304 ze świeżymi nagłówkami i bez treści, a przeglądarka dalej używa swojej kopii. Jeśli coś się zmieniło, serwer wysyła zwykłą odpowiedź 200 z nową treścią.
Silne i słabe tagi
Silny tag, taki jak "v2", obiecuje, że bajty są identyczne. Słaby tag, taki jak W/"v2", obiecuje tylko, że treść jest równoważna. If-None-Match porównuje słabo, więc W/"v2" i "v2" liczą się tam jako dopasowanie; If-Match porównuje silnie i by ich nie dopasował.
Wymiana komunikatów w sieci
Pierwsza wizyta: 200 z walidatorami
Serwer przekazuje ETag i datę Last-Modified razem z treścią.
Kolejna wizyta: 304 bez treści
Przeglądarka odsyła zapisany tag i dostaje tylko nagłówki.
Samodzielna obsługa żądań warunkowych
Serwer http w Node z ETagiem opartym na hashu treści
Hashuje treść, porównuje ją z If-None-Match i przy dopasowaniu wysyła 304 bez treści.
Symulator żądań warunkowych
Co serwer ma teraz
Co wysyła przeglądarka
ETag
Last-Modified
If-None-Match
If-Modified-Since
Odpowiedź serwera
If-None-Match zawiera tag, który przy porównaniu słabym pasuje do bieżącego ETag, więc kopia w cache jest aktualna.
If-None-Match to *, a zasób istnieje, więc warunek jest fałszywy.
Żaden tag w If-None-Match nie pasuje do bieżącego ETag, więc serwer wysyła nową treść. If-Modified-Since nie jest sprawdzany.
Brak If-None-Match, a Last-Modified nie jest późniejszy niż If-Modified-Since.
Brak If-None-Match, a Last-Modified jest późniejszy niż If-Modified-Since.
If-Modified-Since jest obecny, ale jednej z dwóch dat nie da się odczytać, więc nagłówek jest ignorowany.
Żądanie nie ma walidatorów, więc jest zwykłym żądaniem.