Jaka jest różnica między Kontrolą pamięci podręcznej: maksymalny wiek = 0 a brak pamięci podręcznej?

Odpowiedzi:

596

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

Cache-ControlNagłówek ma dwie strony . Jedna strona to miejsce, w którym może zostać wysłane przez serwer WWW (inaczej „serwer pochodzenia”). Druga strona to miejsce, w którym może zostać wysłane przez przeglądarkę (inaczej „agent użytkownika”).


Po wysłaniu przez serwer pochodzenia

Wierzę, że max-age=0po prostu mówi buforom (i agentom użytkownika), że odpowiedź jest przestarzała od samego początku, więc POWINNI oni ponownie zweryfikować odpowiedź (np. Z If-Not-Modifiednagłówkiem) przed użyciem kopii w pamięci podręcznej, a jednocześnie no-cachepowiedzieć im, że MUSZĄ dokonać ponownej weryfikacji przed użyciem buforowanej pamięci Kopiuj. Od 14.9.1 Co można buforować :

bez pamięci podręcznej

... pamięć podręczna NIE MOŻE użyć odpowiedzi do zaspokojenia kolejnego żądania bez pomyślnej ponownej walidacji na serwerze źródłowym. Pozwala to serwerowi źródłowemu zapobiegać buforowaniu nawet przez bufory skonfigurowane do zwracania nieaktualnych odpowiedzi na żądania klientów.

Innymi słowy, pamięci podręczne mogą czasami zdecydować się na użycie nieaktualnej odpowiedzi (chociaż uważam, że muszą dodać Warningnagłówek), ale no-cachetwierdzi, że nie wolno używać nieaktualnej odpowiedzi bez względu na wszystko. Może chcesz tego powinno -revalidate zachowanie podczas statystyki baseball generowane są na stronie, ale że chcesz tego KONIECZNIE -revalidate zachowanie po wygenerowaniu odpowiedź do zakupu e-commerce.

Chociaż masz rację w swoim komentarzu, gdy mówisz, że no-cachenie powinno to uniemożliwiać przechowywania, może to być kolejna różnica podczas używania 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 zaczęły traktować dyrektywę o braku pamięci podręcznej tak, jakby nakazała przeglądarce nawet nie buforować strony. Zaczęliśmy obserwować to zachowanie około rok temu. Podejrzewamy, że ta zmiana była spowodowana powszechnym (i niepoprawnym) użyciem tej dyrektywy w celu zapobiegania buforowaniu.

...

Zauważ, że ostatnio „kontrola pamięci podręcznej: brak pamięci podręcznej” zaczęła również zachowywać się jak dyrektywa „no-store”.

Nawiasem mówiąc, wydaje mi się, że Cache-Control: max-age=0, must-revalidatepowinno to zasadniczo oznaczać to samo, co Cache-Control: no-cache. Więc może to jest sposób na uzyskanie MUSI - zweryfikować zachowanie no-cache, jednocześnie unikając pozornej migracji no-cachedo robienia tego samego, co no-store(tj. Bez buforowania)?


Po wysłaniu przez klienta użytkownika

Wierzę, że odpowiedź shahkalpesh dotyczy strony klienta użytkownika. Możesz także spojrzeć na 13.2.6 Ujednoznaczniające wiele odpowiedzi .

Jeśli klient użytkownika wyśle ​​żądanie z Cache-Control: max-age=0(inaczej „end-to-end revalidation”), wówczas każda pamięć podręczna po drodze ponownie zweryfikuje swój wpis w pamięci podręcznej (np. Z If-Not-Modifiednagłówkiem) aż do serwera źródłowego. Jeśli odpowiedź to 304 (niezmodyfikowana), można użyć encji buforowanej.

Z drugiej strony, wysłanie żądania z Cache-Control: no-cache(aka. „End-to-end reload”) nie jest ponownie sprawdzane, a serwer NIE MOŻE używać kopii w pamięci podręcznej podczas odpowiadania.

Michael Krebs
źródło
9
Czy Cache-Control: max-age = 0, must-revalidate, proxy-revalidate byłoby dokładną równoważnością braku pamięci podręcznej?
Didier A.
1
Świetna odpowiedź, poszedłem przeczytać artykuł, który witryna, ale strona nie jest już ważna. palisade.plynt.com/issues/2008Jul/cache-control-attributes
Craig London
7
Dzięki, @CraigLondon. Przekierowałem go do wersji z pamięci podręcznej.
Michael Krebs
2
must-revalidatenie ma być taki sam jak no-cachelub no-store. Ten ostatni całkowicie pomija pamięć podręczną, ale pierwszy mówi tylko, że pamięć podręczna musi zawsze być sprawdzana pod kątem świeżości, ale jeśli nadal jest aktualna, można jej użyć, co oszczędza przepustowość. To ostatnie wymusza pełne pobieranie plików od początku do końca, zajmując niepotrzebną przepustowość i opóźniając reakcje.
Patanjali
3
@Patanjali no-cache nie „całkowicie pomija pamięci podręcznych” ani „nie wymusza pełnego pobierania plików od początku do końca”, przynajmniej nie we wszystkich przeglądarkach. Specyfikacja mówi tylko, że przeglądarka musi sprawdzić pamięć podręczną.
Franklin Yu
57

maksymalny wiek = 0

Jest to równoważne z kliknięciem przycisku Odśwież , co oznacza, że ​​daj mi najnowszą kopię, chyba że mam już najnowszą kopię.

bez pamięci podręcznej

Przytrzymuje Shift podczas klikania przycisku Odśwież, co oznacza, że ​​po prostu powtórz wszystko bez względu na wszystko.

Gunnar Cheng
źródło
31
To jest niepoprawne. shift-refresh jest twardym odświeżeniem, które jest bardziej podobne dono-store
Michaela
3
Zweryfikowano w przeglądarce Firefox 45.0, która, podobnie jak Chrome 49.0.2623.87 m, wysyła również „Pragma: bez pamięci podręcznej” podczas Shift + odświeżania.
Cees Timmerman
34

Stare pytanie teraz, ale jeśli ktoś inny natrafi na to podczas wyszukiwania tak jak ja, wydaje się, że IE9 użyje tego do skonfigurowania zachowania zasobów podczas korzystania z przycisków Wstecz i Dalej. Gdy używany jest maksymalny wiek = 0 , przeglądarka użyje ostatniej wersji podczas przeglądania zasobu podczas naciśnięcia wstecz / do przodu. Jeśli nie zostanie użyta pamięć podręczna , zasób zostanie ponownie pobrany.

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

El Yobo
źródło
4
Podobnie w IE 8 występują różnego rodzaju problemy „nie można pobrać”, gdy nie używa się pamięci podręcznej przez https. sugerowane rozwiązania czasami obejmują zmianę nagłówków na maksymalny wiek = 0
Robert Christ
28

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 pochodzenia. IE8 traktuje no-cacheodpowiedzi z taką samą semantyką jak max-age=0,must-revalidate. Firefox 3.5 wydaje się jednak traktować no-cachejako równoważny zno-store , który jest do bani pod względem wydajności i wykorzystania przepustowości.

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

Moją radą byłoby wybranie public,max-age=0niewrażliwych zasobów, które chcesz sprawdzać pod kątem świeżości przy każdym żądaniu, ale nadal pozwalają na zwiększenie wydajności i przepustowości buforowania. W przypadku elementów na użytkownika z takim samym uwzględnieniem użyjprivate,max-age=0 .

Unikałbym używania no-cachecałkowicie, ponieważ wygląda na to, że niektóre przeglądarki i popularne pamięci podręczne dały mu dostęp do funkcjonalnego odpowiednikano-store .

Ponadto nie naśladuj Akamai i Limelight. Podczas gdy w gruncie rzeczy zajmują się głównie macierzami buforowania jako swoją podstawową działalnością i powinni być ekspertami, w rzeczywistości są zainteresowani sprawieniem, aby więcej danych zostało pobranych z ich sieci. Google może też nie być dobrym wyborem do emulacji. Wydają się używać max-age=0lub no-cachelosowo w zależności od zasobu.

rmalayter
źródło
2
Najlepsza odpowiedź na treści chronione hasłem. private,max-age=0.
dana
21
maksymalny wiek
    Gdy pośrednia pamięć podręczna jest zmuszona, za pomocą dyrektywy max-age = 0, do ponownej walidacji 
własny wpis w pamięci podręcznej, a klient dostarczył własny weryfikator w żądaniu, 
dostarczony walidator może różnić się od walidatora aktualnie przechowywanego z wpisem pamięci podręcznej. 
W takim przypadku pamięć podręczna MOŻE użyć dowolnego sprawdzania poprawności do utworzenia własnego żądania bez 
wpływające na przejrzystość semantyczną. 

    Wybór walidatora może jednak wpłynąć na wydajność. Najlepsze podejście jest dla
pośrednia pamięć podręczna do korzystania z własnego walidatora podczas wysyłania żądania. Jeśli serwer odpowie
z 304 (niezmodyfikowane), pamięć podręczna może zwrócić teraz sprawdzoną kopię klientowi 
z odpowiedzią 200 (OK). Jeśli serwer odpowiada nowym podmiotem i narzędziem sprawdzającym pamięć podręczną,
jednak pośrednia pamięć podręczna może porównać zwrócony walidator z tym podanym w 
żądanie klienta, przy użyciu silnej funkcji porównania. Jeśli weryfikatorem klienta jest
równa serwerowi źródłowemu, wówczas pamięć podręczna pośrednia po prostu zwraca 304 (nie 
Zmodyfikowany). W przeciwnym razie zwraca nowy byt z odpowiedzią 200 (OK).

    Jeśli żądanie zawiera dyrektywę o braku pamięci podręcznej, NIE POWINIEN zawierać min-fresh, 
maksymalnie przestarzały lub maksymalny wiek. 

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

Nie akceptuj tego jako odpowiedzi - będę musiał go przeczytać, aby zrozumieć jego prawdziwe użycie :)

shahkalpesh
źródło
12

Nie jestem ekspertem od pamięci podręcznej, ale Mark Nottingham jest. Oto jego dokumenty dotyczące buforowania . Ma również doskonałe linki w sekcji Referencje.

Na podstawie mojej lektury tych dokumentów wygląda na to, że max-age=0pamięć podręczna może wysłać buforowaną odpowiedź na żądania, które nadeszły w „tym samym czasie”, gdzie „ten sam czas” oznacza wystarczająco blisko siebie, że wyglądają jednocześnie na pamięć podręczną, ale no-cachenie .

Hank Gay
źródło
Dobra uwaga, ale czy w praktyce tak naprawdę robią to jakieś przeglądarki?
Pacerier
3
@Pacerier Myślę, że to bardziej do buforowania serwerów proxy, takich jak Varnish, Squid, Traffic itp.
Hank Gay
12

Nawiasem mówiąc, warto zauważyć, że niektóre urządzenia mobilne, w szczególności produkty Apple, takie jak iPhone / iPad, całkowicie ignorują nagłówki, takie jak brak pamięci podręcznej, brak sklepu, wygasa: 0 lub cokolwiek innego, co możesz spróbować zmusić je do ponownego użycia wygasły tworzyć strony.

Nie spowodowało to końca problemów, ponieważ próbujemy uzyskać informację o tym, że użytkownik iPada powiedział, że śpi na stronie, do której dotarł w procesie formularza, powiedzmy krok 2 z 3, a następnie urządzenie całkowicie ignoruje sklep / dyrektywy pamięci podręcznej i, o ile mogę stwierdzić, po prostu pobiera wirtualną migawkę strony od jej ostatniego stanu, to znaczy ignorując to, co zostało wyraźnie powiedziane, i nie tylko, biorąc stronę, która nie powinna być przechowywana i przechowywanie go bez ponownego sprawdzania, co prowadzi między innymi do różnego rodzaju dziwnych problemów z sesją.

Dodam to tylko na wypadek, gdyby ktoś się pojawił i nie mógł zrozumieć, dlaczego występują błędy sesji, szczególnie w przypadku iPhone'ów i iPadów, które wydają się zdecydowanie najgorszymi przestępcami w tej dziedzinie.

Z tym problemem przeprowadziłem dość obszerne testy debugowania i oto mój wniosek, urządzenia całkowicie ignorują te dyrektywy.

Nawet przy regularnym użyciu zauważyłem, że niektóre telefony komórkowe również zupełnie nie sprawdzają nowych wersji za pomocą powiedzmy: Wygasa: 0, a następnie sprawdzają daty ostatniej modyfikacji, aby ustalić, czy powinna otrzymać nową.

Po prostu tak się nie dzieje, więc musiałem dodać ciągi zapytań do plików css / js, których potrzebowałem, aby wymusić aktualizacje, co powoduje, że głupie urządzenia mobilne zaczynają myśleć, że to plik, którego nie ma, na przykład: mój .css? v = 1, a następnie v = 2 dla aktualizacji css / js. To w dużej mierze działa.

Przeglądarki użytkowników, nawiasem mówiąc, jeśli pozostawione są do wartości domyślnych, od 2016 r., Ponieważ ciągle odkrywam (robimy DUŻO zmian i aktualizacji na naszej stronie) również nie sprawdzają dat ostatniej modyfikacji takich plików, ale zapytanie Metoda string rozwiązuje ten problem. Jest to coś, co zauważyłem u klientów i pracowników biurowych, którzy zwykle używają podstawowych normalnych ustawień domyślnych użytkownika w swoich przeglądarkach i nie mają świadomości problemów z buforowaniem w css / js itp., Prawie zawsze nie dostają nowego css / js po zmianie, co oznacza, że ​​ustawienia domyślne dla swoich przeglądarek, głównie MSIE / Firefox, nie robią tego, co im każą, ignorują zmiany i ignorują daty ostatniej modyfikacji i nie sprawdzają poprawności, nawet przy jawnym ustawieniu Expires: 0.

To był dobry wątek z dużą ilością dobrych informacji technicznych, ale ważne jest również, aby zauważyć, jak słaba jest obsługa tego typu urządzeń w szczególności na urządzeniach mobilnych. Co kilka miesięcy muszę dodawać kolejne warstwy ochrony przed nieprzestrzeganiem otrzymywanych poleceń nagłówka lub ich prawidłową interpretacją.

Lizardx
źródło
css i js są odpowiednimi kandydatami do buforowania, ponieważ w systemach produkcyjnych nie powinny tak naprawdę często się zmieniać. Jednak buforowanie ich podczas rozwijania jest uciążliwe, ponieważ aktywność ta może wymagać częstych wymuszonych opróżnień pamięci podręcznej. Ale jeśli nie można użyć różnych ustawień dla różnych środowisk, wymagania produkcyjne powinny mieć pierwszeństwo, ponieważ ma to największy wpływ, ponieważ znacznie większa liczba dostępów pozwoli zaoszczędzić przepustowość, w porównaniu z kilkoma odświeżeniami Ctrl-F5, które kilku programistów będzie miało do zrobienia. Jednak sprawdzanie danych w czasie rzeczywistym wymaga prawidłowego działania kontroli pamięci podręcznej.
Patanjali
0

Jedną rzeczą, o której (niespodziewanie) nie wspomniano, jest to, że żądanie może jednoznacznie wskazać, że zaakceptuje nieaktualne dane, korzystając z max-staledyrektywy. W takim przypadku, jeśli serwer zareagowałby max-age=0, pamięć podręczna po prostu uznałaby odpowiedź za nieaktualną i mogłaby użyć jej do spełnienia żądania klienta [który poprosił o potencjalnie nieaktualne dane]. W przeciwieństwie do tego, jeśli serwer wysyła, no-cacheto naprawdę przebija każde żądanie klienta (z max-stale) o nieaktualne dane, ponieważ pamięć podręczna MUSI zostać ponownie sprawdzona.

Ethan
źródło
-2

Różnica polega na tym, że brak pamięci podręcznej (brak sklepu w przeglądarce Firefox) uniemożliwia jakiekolwiek buforowanie. Może to być przydatne, aby zapobiec zapisywaniu stron z bezpieczną treścią na dysku oraz stron, które powinny być zawsze aktualizowane, nawet jeśli zostaną ponownie odwiedzone za pomocą przycisku Wstecz.

max-age = 0 wskazuje, że pozycja pamięci podręcznej jest nieaktualna i wymaga ponownej weryfikacji, ale nie zapobiega buforowaniu. Często przeglądarki sprawdzają zasoby tylko raz na sesję przeglądarki, więc treść może nie zostać zaktualizowana, dopóki witryna nie zostanie odwiedzona w nowej sesji.

Zwykle przeglądarki nie usuwają pozycji wygasłych pamięci podręcznej, chyba że zajmują miejsce na nowsze treści, gdy pamięć podręczna przeglądarki jest pełna. Korzystanie z no-store, no-cache pozwala na jawne usunięcie wpisu z pamięci podręcznej.

HttpWatchSupport
źródło
9
O ile rozumiem, „no-cache” NIE powinien zapobiegać przechowywaniu („no-store” jest właściwym sposobem na osiągnięcie tego). Czy niektóre przeglądarki interpretują „brak pamięci podręcznej” jako „brak sklepu”? To by wyjaśniało, dlaczego „max-age = 0” jest używane zamiast po prostu „bez pamięci podręcznej”
rubyruy
3
To jest źle. Patrz wyżej. Niektóre przeglądarki / serwery mogą zdecydować się na wdrożenie no-cache jako no-store, ale nie wszystkie.
Jeremy Kauffman,
4
Jedynym bezpiecznym sposobem jest użycie, max-age=0jeśli masz na myśli, że buforowanie jest dozwolone, ale zasób powinien zostać ponownie sprawdzony i no-storejeśli nie chcesz, aby odpowiedź była w ogóle przechowywana w pamięci podręcznej. no-cacheJest losowo wyznaczone oznaczać jeden z nich w zależności od dostawcy agenta użytkownika i numer wersji i protokół transmisji.
Mikko Rantalainen,
Kiedy Firefox używa no-store?
Cees Timmerman