Kiedy odwiedzam chesseng.herokuapp.com , otrzymuję nagłówek odpowiedzi, który wygląda jak
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
a potem odświeżam stronę i otrzymuję
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
więc wygląda na to, że buforowanie działa. Jeśli to działa w przypadku buforowania, to jaki jest cel Expires i Cache-Control: max-age . Aby wprowadzić w błąd, gdy testuję stronę pod adresem https://developers.google.com/speed/pagespeed/insights/ , wyświetla mi się komunikat „Wykorzystaj pamięć podręczną przeglądarki”.
http
caching
http-headers
browser-cache
cache-control
user782220
źródło
źródło
Odpowiedzi:
Aby odpowiedzieć na pytanie, dlaczego działa buforowanie, mimo że serwer WWW nie zawierał nagłówków:
[a date]
[seconds]
Serwer uprzejmie poprosił pośredników proxy, aby nie buforowali zawartości (tj. Element powinien być przechowywany tylko w prywatnej pamięci podręcznej, tj. Tylko na własnym komputerze lokalnym):
Ale serwer zapomniał dołączyć jakichkolwiek wskazówek dotyczących buforowania:
Ale w odpowiedzi zawarli datę ostatniej modyfikacji :
Ponieważ przeglądarka zna datę modyfikacji pliku, może wykonać żądanie warunkowe . Poprosi serwer o plik, ale poinstruuje serwer, aby wysłał plik tylko wtedy, gdy był modyfikowany od 2012/10/16 3:13:38:
Serwer odbiera żądanie, zdaje sobie sprawę, że klient ma już najnowszą wersję. Zamiast wysyłać klienta
200 OK
, a następnie zawartość strony, zamiast tego mówi ci, że twoja buforowana wersja jest dobra:Twoja przeglądarka musiała cierpieć z powodu opóźnienia w wysłaniu żądania do serwera i czekać na odpowiedź, ale zaoszczędziła konieczności ponownego pobierania statycznej zawartości.
Dlaczego Max-Age ? Dlaczego wygasa ?
Ponieważ Last-Modified jest do bani.
Nie wszystko na serwerze ma przypisaną datę. Jeśli tworzę stronę w locie, nie ma z tym żadnej daty - jest teraz . Ale jestem całkowicie skłonny pozwolić użytkownikowi buforować stronę główną przez 15 sekund:
Jeśli użytkownik uderzy F5, będzie nadal pobierał wersję z pamięci podręcznej przez 15 sekund. Jeśli jest to korporacyjny serwer proxy, wszyscy 67198 użytkowników trafiających na tę samą stronę w tym samym 15-sekundowym oknie otrzymają tę samą zawartość - wszystko obsługiwane z zamkniętej pamięci podręcznej. Wydajność wygrywa dla każdego.
Zaletą dodawania
Cache-Control: max-age
jest to, że przeglądarka nie musi nawet wykonywać warunkowego żądania.Last-Modified
, przeglądarka musi wykonać żądanieIf-Modified-Since
i czekać na304 Not Modified
odpowiedźmax-age
, przeglądarka nie będzie musiała nawet cierpieć w obie strony sieci; zawartość wyjdzie prosto z pamięci podręcznychRóżnica między „Cache-Control: max-age” a „Expires”
Expires
jest starszym odpowiednikiem nowoczesnego (ok. 1998)Cache-Control: max-age
nagłówka:Expires
: określasz datę (fuj)max-age
: określasz sekundy (dobroć)Jeśli oba są określone, przeglądarka używa
max-age
:Żadna witryna internetowa napisana po 1998 roku nie powinna
Expires
już używać , a zamiast tego używaćmax-age
.Co to jest ETag?
ETag jest podobny do Last-Modified , z tym wyjątkiem, że nie musi to być data - po prostu musi być czymś .
Jeśli
rowversion
wyciągam listę produktów z bazy danych, serwer może wysłać ostatni jako ETag, a nie datę:Mój ETag może być hashem SHA1 zasobu statycznego (np. Obraz, js, css, czcionka) lub strony wyrenderowanej w pamięci podręcznej (tj. To właśnie robi wiki Mozilla MDN; haszuje ostateczny znacznik):
I dokładnie tak, jak w przypadku żądania warunkowego opartego na Last-Modified :
Mogę wykonać warunkowe żądanie na podstawie ETag:
An
ETag
jest lepszy od,Last-Modified
ponieważ działa w przypadku rzeczy innych niż pliki lub rzeczy, które mają pojęcie daty . Po prostu jestźródło
cache-control
nie istnieje? Masz tylko Etag? Czy nadal nie trzeba wysyłać „warunkowego żądania” do serwera? Zachowanie, które widzę, gdy jestem offline, polega na tym, że po prostu wraca z pamięci podręcznej. Ale gdy jest offline, nie może wysłać tego warunkowego żądania. Czy to oznacza, że będzie buforować na czas nieokreślony, jeśli pozostaniesz w trybie offline? Już tutaj szczegółowo zadałem to pytanie . Możesz spojrzeć?Z RFC2616 sekcja 14.9.1
źródło
Cache-Control:private
tylko stwierdza, że współużytkowane pamięci podręczne (takie jak pamięci podręczne proxy) nie powinny buforować odpowiedzi.proxy-revalidate
wymaga, aby serwery proxy zawsze weryfikowały poprawność przy każdym dostępie. Gdzie asprivate
zapobiega buforowaniu serwera proxy.RFC 2616, sekcja 14.9.1 :
Przeglądarki mogą wykorzystać te informacje. Oczywiście aktualny „użytkownik” może oznaczać wiele rzeczy: użytkownika systemu operacyjnego, użytkownika przeglądarki (np. Profile Chrome), itp. Nie jest określony.
Dla mnie bardziej konkretny przykład na
Cache-Control: private
to, że serwery proxy (które zazwyczaj mają wielu użytkowników) nie będzie buforować go. Jest przeznaczony dla użytkownika końcowego i nikogo innego.FYI, RFC wyjaśnia, że nie zapewnia to bezpieczeństwa. Chodzi o to, aby wyświetlać prawidłowe treści, a nie zabezpieczać treści.
źródło
Pole nagłówka encji Expires podaje datę / godzinę, po której odpowiedź jest uważana za przestarzałą. Pole Cache-control: maxage podaje wartość wieku (w sekundach) większą niż odpowiedź uważana za nieaktualną.
Mimo że powyższe pole nagłówka daje klientowi mechanizm decydujący o tym, czy wysłać żądanie do serwera. W pewnych warunkach klient wysyła żądanie do serwera, a wartość wieku odpowiedzi jest większa niż wartość maksymalna, dawka oznacza, że serwer musi wysłać zasób do klienta? Może zasoby nigdy się nie zmieniły.
Aby rozwiązać ten problem, HTTP1.1 podaje ostatnio zmodyfikowaną nagłówek. Serwer przekazuje klientowi datę ostatniej modyfikacji odpowiedzi. Gdy klient potrzebuje tego zasobu, wyśle pole nagłówka If-Modified-Since do serwera. Jeśli ta data przypada przed datą modyfikacji zasobu, serwer wyśle zasób do klienta i przekaże kod 200, w przeciwnym razie zwróci klientowi kod 304, co oznacza, że klient może korzystać z zasobu, który buforował.
źródło