Dlaczego ta odpowiedź jest buforowana?


32

Mam klienta, którego strona index.html obecnie powraca z tymi nagłówkami:

Zakresy akceptacji: bajty
Połączenie: Keep-Alive
Kodowanie treści: gzip
Długość treści: 3658
Content-Type: text / html
Data: czw., 10 października 2013 07:36:27 GMT
ETag: „4aa95e1-2ed2-4e721324728b7”
Keep-Alive: limit czasu = 5, maks. = 100
Ostatnia modyfikacja: wtorek, 24 września 2013 13:34:30 GMT
Serwer: Apache / 2.2.22
Różni się: kodowanie akceptacji, agent użytkownika

Ja oczywiście zamierza zalecić dodają Expireslub Cache-Controlw razie potrzeby, ale jestem zdezorientowany: Chrome buforuje ten zasób i używa go z pamięci podręcznej (nie wysyłając wniosek w ogóle ), nawet po kilku godzinach (na przykład, użyć ponownie kopię buforował wczoraj o 13:30 dziś rano o 8:30). Widzę to dość wyraźnie na karcie Sieć konsoli Chrome, gdzie pokazuje żądanie i ma 200 (OK)kolor szary w kolumnie Stan i (from cache)w kolumnie Rozmiar . (Nie zmieniłem domyślnych ustawień buforowania Chrome).

Zdaję sobie sprawę, że specyfikacja pozwala agentom użytkownika na podejmowanie własnych decyzji w przypadku braku wskazówek ze strony nagłówków. Czy to się tu dzieje? Chrome widzi, że była ostatnio modyfikowana kilka dni temu, i może swobodnie korzystać z wersji, która (powiedzmy) jest nieaktualna? A może brakuje mi czegoś?

Odpowiedzi:


33

Kiedy „Wygasa” i nagłówki „Cache-Control” nie są określone, ale „Last-Modified” nagłówek jest określony, przeglądarki mają odgadnąć, jak długo powinny one zachować dokument w pamięci podręcznej. Niektóre przeglądarki robić algorytmy mechanicznych, które pozwalają strony pozostają w pamięci podręcznej na dzień lub więcej.

Przewodnik po najlepszych praktykach buforowania Google stwierdza:

Ostatnia modyfikacja to „słaby” nagłówek buforowania, ponieważ przeglądarka stosuje heurystykę w celu ustalenia, czy pobrać element z pamięci podręcznej, czy nie. (Heurystyka różni się w zależności od przeglądarki).


Mozilla (Firefox) ma często zadawane pytania dotyczące buforowania HTTP, które przedstawiają ich algorytm dla tej sytuacji (chociaż możliwe jest, że algorytm zmienił się od czasu dokumentu z 2002 roku):

... szukamy nagłówka „Last-Modified”. Jeśli ten nagłówek jest obecny, czas życia pamięci podręcznej jest równy wartości nagłówka „Data” minus wartość nagłówka „Ostatnia modyfikacja” podzielona przez 10.

Więc w twoim przypadku, gdy różnica między zmodyfikowanym a teraz wynosi 15 dni, wtedy Firefox będzie buforował zasób przez 1,5 dnia.

Wygląda na to, że wszystkie główne przeglądarki używają tej samej reguły 10%, którą implementuje Firefox. Pytanie został poproszony o StackOveflow prośbą o tych heurystyk . Różne odpowiedzi dla różnych przeglądarek pokazują, że wszystkie mają podobne implementacje. Istnieją odpowiedzi na Internet Explorer i Webkit (Chrome i Safari).


Rozmiar pamięci podręcznej przeglądarki będzie prawdopodobnie czynnikiem ograniczającym dla pliku, który według algorytmu buforowania może być przechowywany dłużej niż jeden dzień. Przeglądarki mają zazwyczaj ustawienie ilości miejsca na dysku używanego do buforowania. Wielu użytkowników usuwa również pamięć podręczną po zamknięciu przeglądarki. Czas przechowywania takiego pliku w pamięci podręcznej zwykle zależy od:

  • Ilość pamięci podręcznej przydzielonej przez przeglądarkę
  • Liczba witryn odwiedzanych przez użytkownika (i rozmiar tych witryn)
  • Czy użytkownik zamknął przeglądarkę

Czy możesz wyjaśnić „wtedy Firefox będzie buforował zasoby przez 1,5 dnia”. Od której daty będzie buforowany do 1,5 dnia? Jeśli to już 15 dni, to już by wygasło, prawda? A ponieważ TERAZ minus ostatnia modyfikacja będzie wiecznie wzrastać, masz na myśli, że będzie buforowana na zawsze!
myDoggyWritesCode

1
Nie zawsze. Przez 1/10 czasu między ostatnim zmodyfikowanym nagłówkiem a czasem pobierania. Jeśli minęło 15 dni, może to oznaczać, że minęło 150 dni od ostatniej modyfikacji pliku.
Stephen Ostermiller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.