Jaka jest różnica między Cache-Control: max-age=0 I no-cache?

Nagłówek Cache-Control: max-age=0 oznacza, że zawartość jest uważana za przestarzałą (i musi zostać natychmiast pobrana), co w efekcie jest tym samym co Cache-Control: no-cache.

Author: Paulo Boaventura, 2009-06-26

8 answers

Miałem to samo pytanie i znalazłem kilka informacji w moich poszukiwaniach (twoje pytanie pojawiło się jako jeden z wyników). Oto, co ustaliłem...

Nagłówek Cache-Control ma dwie strony. Jedna strona jest tam, gdzie może być wysłany przez serwer WWW (aka. "origin server"). Druga strona jest tam, gdzie może być wysłany przez przeglądarkę (aka. "user agent").


Po wysłaniu przez serwer origin

Wydaje mi się, że max-age=0 po prostu mówi cache (i agentom użytkownika), że odpowiedź jest Nieświeża z get-go i tak powinny ponownie zatwierdzić odpowiedź (np. z nagłówkiem If-Not-Modified) przed użyciem buforowanej kopii, podczas gdy no-cache mówi im, że muszą zmienić walidację przed użyciem buforowanej kopii. Od 14.9.1 Co to jest Cacheable :

No-cache

...pamięć podręczna nie może używać odpowiedzi aby zaspokoić kolejne żądanie bez udanej rewalidacji z serwer origin. Pozwala to na serwer origin zapobiegający buforowaniu parzyste przez bufory, które zostały skonfigurowane do zwróć nieświeże odpowiedzi do klienta prośby.

Innymi słowy, bufory mogą czasami wybrać użycie starej odpowiedzi (chociaż uważam, że muszą dodać nagłówek Warning), ale no-cache mówi, że nie mogą używać starej odpowiedzi bez względu na wszystko. Może chcesz powinno - zmienić zachowanie, gdy statystyki baseball są generowane na stronie, ale chcesz musi - zmienić zachowanie, gdy wygenerowałeś odpowiedź na zakup e-commerce.

Chociaż masz rację w komentarzu, kiedy mówisz, że {[3] } nie ma zapobiegać przechowywaniu, może to być inna różnica przy użyciu no-cache. Natknąłem się na stronę, dyrektywy kontroli pamięci podręcznej Demystified , która mówi (nie mogę ręczyć za jej poprawność):

W praktyce IE i Firefox mają zaczął traktować no-cache dyrektywa jakby nakazywała przeglądarka nawet nie buforuje strony. My zaczął obserwować to zachowanie jakiś rok temu. Podejrzewamy, że zmiana ta została spowodowana przez powszechne (i Nieprawidłowe) wykorzystanie tego dyrektywa zapobiegająca buforowaniu.

...

Zauważ, że ostatnio, " cache-control: no-cache " również zaczął działać jak dyrektywa "nie-Sklep".

Na marginesie, wydaje mi się, że Cache-Control: max-age=0, must-revalidate powinno w zasadzie oznaczać to samo, co Cache-Control: no-cache. Więc może to jest sposób, aby uzyskać musi - rewalidować zachowanie no-cache, unikając pozornej migracji no-cache do robienia tego samego co no-store (tj. żadnego buforowania)?


Gdy wysłane przez agenta użytkownika

Uważam, że odpowiedź shahkalpesha dotyczy strony agenta użytkownika. Możesz również spojrzeć na 13.2.6 Disambiguating Multiple Responses .

Jeśli agent użytkownika wysyła żądanie za pomocą Cache-Control: max-age=0 (aka. "end-to-end revalidation"), wtedy każdy cache po drodze będzie odnawiał swój wpis cache (np. z nagłówkiem If-Not-Modified) aż do serwera źródłowego. Jeśli odpowiedź jest wtedy 304( Nie zmodyfikowana), można użyć buforowanego elementu.

Z drugiej strony, Wysyłając zapytanie za pomocą Cache-Control: no-cache (aka. "end-to-end reload") nie aktualizuje i Serwer nie może używać buforowanej kopii podczas odpowiadania.

 614
Author: Michael Krebs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:25

Max-age=0

Jest to równoważne kliknięciu Refresh, co oznacza, że daj mi najnowszą kopię, chyba że mam już najnowszą kopię.

No-cache

To przytrzymanie Shift podczas klikania odśwież, co oznacza, że po prostu powtórz wszystko bez względu na wszystko.

 54
Author: G. Cheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 04:11:48

Stare pytanie, ale jeśli ktoś jeszcze natknie się na to poprzez wyszukiwanie, tak jak ja, wydaje się, że IE9 będzie używał tego do konfigurowania zachowania zasobów podczas korzystania z przycisków Wstecz i do przodu. Gdy używana jest max-age=0 , przeglądarka użyje ostatniej wersji podczas przeglądania zasobów po naciśnięciu wstecz / do przodu. Jeśli no-cache jest używany, zasób zostanie ponownie wykryty.

Więcej szczegółów na temat buforowania IE9 można zobaczyć na tym blogu buforowania msdn post .

 34
Author: El Yobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 09:13:04

W moich ostatnich testach z IE8 i Firefox 3.5, wydaje się, że oba są zgodne z RFC. Różnią się jednak swoją "przyjaznością" dla serwera origin. IE8 traktuje odpowiedzi no-cache z tą samą semantyką co max-age=0,must-revalidate. Firefox 3.5 wydaje się jednak traktować no-cache jako odpowiednik no-store, co jest do bani ze względu na wydajność i wykorzystanie przepustowości.

Domyślnie Cache Squid nigdy nie przechowuje niczego z nagłówkiem no-cache, tak jak Firefox.

Radzę ustawić public,max-age=0 dla zasoby niewrażliwe, które chcesz sprawdzić pod kątem świeżości przy każdym żądaniu, ale nadal umożliwiają wydajność i przepustowość buforowania. W przypadku pozycji dla każdego użytkownika z tym samym uwzględnieniem, użyj private,max-age=0.

Uniknąłbym całkowicie używania no-cache, gdyż wydaje się, że zostało ono przez niektóre przeglądarki i popularne buforowanie do funkcjonalnego odpowiednika no-store.

Dodatkowo, nie naśladuj Akamai i Limelight. Podczas gdy zasadniczo uruchamiają ogromne tablice buforujące jako ich podstawowej działalności, i powinny być ekspertami, faktycznie mają żywotny interes w powodowaniu większej ilości danych do pobrania z ich sieci. Google może też nie być dobrym wyborem do emulacji. Wydają się używać max-age=0 lub no-cache losowo w zależności od zasobu.

 28
Author: rmalayter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 04:18:31
max-age
    When an intermediate cache is forced, by means of a max-age=0 directive, to revalidate 
its own cache entry, and the client has supplied its own validator in the request, the 
supplied validator might differ from the validator currently stored with the cache entry. 
In this case, the cache MAY use either validator in making its own request without 
affecting semantic transparency. 

    However, the choice of validator might affect performance. The best approach is for the 
intermediate cache to use its own validator when making its request. If the server replies 
with 304 (Not Modified), then the cache can return its now validated copy to the client 
with a 200 (OK) response. If the server replies with a new entity and cache validator, 
however, the intermediate cache can compare the returned validator with the one provided in 
the client's request, using the strong comparison function. If the client's validator is 
equal to the origin server's, then the intermediate cache simply returns 304 (Not 
Modified). Otherwise, it returns the new entity with a 200 (OK) response. 

    If a request includes the no-cache directive, it SHOULD NOT include min-fresh, 
max-stale, or max-age. 

Dzięki Uprzejmości: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Nie przyjmuj tego jako odpowiedzi - będę musiał ją przeczytać, aby zrozumieć prawdziwe jej użycie:)

 22
Author: shahkalpesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 01:44:27

Nie jestem ekspertem od buforowania, ale Mark Nottingham jest. Oto jego dokumenty buforowania. Ma również doskonałe linki w sekcji Referencje.

Opierając się na moim odczycie tych dokumentów, wygląda na to, że max-age=0 może pozwolić pamięci podręcznej na wysłanie buforowanej odpowiedzi na żądania, które przyszły w "tym samym czasie", gdzie "ten sam czas" oznacza wystarczająco blisko siebie, że wyglądają jednocześnie do pamięci podręcznej, ale no-cache nie.

 13
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 02:12:52

Przy okazji, warto zauważyć, że niektóre urządzenia mobilne, szczególnie produkty Apple, takie jak iPhone / iPad, całkowicie ignorują nagłówki, takie jak no-cache, no-store, Expires: 0, lub cokolwiek innego, możesz spróbować zmusić je do nie ponownego użycia wygasłych stron formularza.

To sprawiło, że nie ma końca bóle głowy, ponieważ staramy się uzyskać problem iPada użytkownika powiedzmy, pozostawienie śpiącej na stronie, do której dotarli w procesie formularza, powiedzmy Krok 2 z 3, a następnie urządzenie całkowicie ignoruje dyrektywy store/cache, i o ile mogę powiedzieć, po prostu pobiera to, co jest wirtualną migawką strony z jej ostatniego stanu, to znaczy ignoruje to, co zostało wyraźnie powiedziane, a nie tylko, biorąc stronę, która nie powinna być przechowywana, i przechowując ją bez ponownego sprawdzania, co prowadzi do różnego rodzaju dziwnych problemów z sesją, między innymi.

Dodaję to na wypadek, gdyby ktoś się pojawił i nie mógł dowiedzieć się, dlaczego dostają błędy sesji w szczególności iphone ' ów i iPadów, które wydają się daleko do najgorszych przestępców w tej dziedzinie.

Przeprowadziłem dość obszerne testy debuggera z tym problemem i taki jest mój wniosek, urządzenia całkowicie ignorują te dyrektywy.

Nawet w regularnym użyciu, odkryłem, że niektóre telefony komórkowe również całkowicie nie sprawdzają nowych wersji przez powiedzieć, Expires: 0 następnie sprawdzanie daty ostatniej modyfikacji, aby ustalić, czy powinien dostać nową.

To po prostu się nie zdarza, więc musiałem dodać ciągi zapytań do plików css / js Musiałem wymusić aktualizacje, które oszukują głupie urządzenia mobilne, myśląc, że to plik, którego nie ma, jak: mój.css?v= 1, następnie v=2 dla aktualizacji css / js. To w dużej mierze działa.

Użytkownicy przeglądarek również, przy okazji, jeśli pozostawione do ich domyślnych, od 2016, jak ciągle odkrywam (robimy wiele zmian i aktualizacji na naszej stronie) również nie sprawdzić daty Ostatnio zmodyfikowane na takich plikach, ale metoda ciąg zapytania rozwiązuje ten problem. To jest coś, co zauważyłem z klientami i biurem ludzie, którzy mają tendencję do korzystania z podstawowych normalnych domyślnych ustawień użytkownika w swoich przeglądarkach i nie mają świadomości problemów z buforowaniem css/js itp., prawie zawsze nie udaje się uzyskać nowego css / JS przy zmianie, co oznacza, że domyślne dla swoich przeglądarek, głównie MSIE / Firefox, nie robią tego, co im się każe, ignorują zmiany i ignorują daty ostatniej modyfikacji i nie sprawdzają poprawności, nawet z expires: 0 ustawionym jawnie.

To był dobry wątek z wieloma dobrymi informacjami technicznymi, ale ważne jest też aby zauważyć, jak złe jest wsparcie dla tych rzeczy w szczególności urządzeń mobilnych. Co kilka miesięcy muszę dodawać kolejne warstwy ochrony przed ich nieprzestrzeganiem poleceń nagłówka, które otrzymują, lub poprawnym interpetowaniem tych poleceń.

 12
Author: Lizardx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 19:54:10

Jedna rzecz ,o której (zaskakująco) nie wspomniano, to to, że żądanie może wyraźnie wskazać, że będzie akceptować stare dane, używając dyrektywy max-stale. W takim przypadku, gdyby serwer odpowiedział max-age=0, Pamięć podręczna uznałaby jedynie, że odpowiedź jest przestarzała i mogłaby ją wykorzystać do zaspokojenia żądania klienta [który poprosił o potencjalnie przestarzałe dane]. Natomiast jeśli serwer wyśle no-cache to naprawdę nie ma żadnego żądania klienta (z max-stale) o stare dane, ponieważ cache musi / align = "left" /

 0
Author: Ethan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-16 02:52:52