Różnica między no-cache i must-revalidate

179

Z RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

no-cache

Jeśli dyrektywa no-cache nie określa nazwy pola, pamięć podręczna NIE MOŻE używać odpowiedzi w celu spełnienia kolejnego żądania bez pomyślnej ponownej walidacji z serwerem pochodzenia. Dzięki temu serwer pochodzenia może zapobiegać buforowaniu nawet przez pamięci podręczne, które zostały skonfigurowane do zwracania nieaktualnych odpowiedzi na żądania klientów.

Dlatego nakazuje agentom ponowne zweryfikowanie wszystkich odpowiedzi.

W porównaniu z

musi ponownie zweryfikować

Gdy dyrektywa must-revalidate jest obecna w odpowiedzi otrzymanej przez pamięć podręczną, ta pamięć podręczna NIE MOŻE używać wpisu po tym, jak stanie się nieaktualny, aby odpowiedzieć na kolejne żądanie bez uprzedniego ponownego zweryfikowania go z serwerem pochodzenia

Dlatego kieruje agentów do ponownej walidacji nieaktualnych odpowiedzi.

W szczególności w odniesieniu do tego no-cache, czy w ten sposób programy użytkownika empirycznie traktują tę dyrektywę?

Jaki jest sens, no-cachejeśli jest must-revalidatei max-age?

Zobacz ten komentarz:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

no-cache

Chociaż ta dyrektywa brzmi tak, jakby instruowała przeglądarkę, aby nie buforowała strony, istnieje subtelna różnica. Dyrektywa „no-cache”, zgodnie z RFC, mówi przeglądarce, że powinna przeprowadzić ponowną weryfikację z serwerem przed wyświetleniem strony z pamięci podręcznej. Ponowna walidacja to zgrabna technika, która pozwala aplikacji zachować szerokość pasma. Jeśli strona zapisana w pamięci podręcznej przeglądarki nie uległa zmianie, serwer po prostu sygnalizuje to przeglądarce, a strona jest wyświetlana z pamięci podręcznej. Dlatego przeglądarka (przynajmniej w teorii) przechowuje stronę w swojej pamięci podręcznej, ale wyświetla ją dopiero po ponownej walidacji z serwerem. W praktyce IE i Firefox zaczęły traktować dyrektywę no-cache tak, jakby instruowała przeglądarkę, aby nawet nie buforowała strony. Zaczęliśmy obserwować to zachowanie około rok temu.

Czy ktoś ma w tej sprawie coś bardziej oficjalnego?

Aktualizacja

Dyrektywa must-revalidate powinna być używana przez serwery wtedy i tylko wtedy, gdy brak walidacji żądania w reprezentacji może skutkować nieprawidłową operacją, taką jak cicha niezrealizowana transakcja finansowa.

To jest coś, czego nigdy nie wziąłem sobie do serca. RFC mówi, że nie wolno lekceważyć konieczności ponownej walidacji. Chodzi o to, że w przypadku usług internetowych musisz spojrzeć negatywnie i założyć najgorsze dla nieznanych aplikacji klienckich. Każdy przestarzały zasób może spowodować problem.

I coś, co właśnie rozważałem, bez Last-Modified lub ETagów, przeglądarka może ponownie pobrać cały zasób. Jednak w przypadku ETagów zauważyłem, że Chrome przynajmniej wydaje się ponownie sprawdzać poprawność przy każdym żądaniu. Co sprawia, że ​​obie te dyrektywy są wątpliwe lub przynajmniej źle nazwane, ponieważ nie mogą poprawnie zweryfikować poprawności, chyba że żądanie zawiera również inne nagłówki, które i tak powodują „zawsze ponownie waliduj”.

Chcę tylko wyjaśnić ten ostatni punkt. Po prostu ustawiając, must-revalidateale bez uwzględnienia ETag lub Last-Modified, agent może tylko ponownie pobrać zawartość, ponieważ nie ma nic do wysłania na serwer do porównania.

Jednak moje testy empiryczne wykazały, że kiedy ETag lub zmodyfikowane dane nagłówka są zawarte w odpowiedziach, agenci i tak zawsze dokonują ponownej walidacji, niezależnie od obecności must-revalidatenagłówka.

Tak więc must-revalidatechodzi o wymuszenie `` pominięcia pamięci podręcznej '', gdy się zestarzeje, co może się zdarzyć tylko wtedy, gdy ustawisz czas życia / wiek, więc jeśli must-revalidatejest ustawiony na odpowiedź bez wieku lub innych nagłówków, w rzeczywistości staje się odpowiednikiem no-cacheod odpowiedź zostanie natychmiast uznana za nieaktualną.

- Więc w końcu zaznaczę odpowiedź Gili!

Luke Puplett
źródło
Teoretycznie więc różnica polega na sprawdzaniu poprawności zawsze i sprawdzaniu poprawności, jeśli nieaktualne , podczas gdy w praktyce niektóre przeglądarki nie traktują pamięci podręcznej, ponieważ cytowany przez Ciebie komentarz mówi, że nigdy nie sprawdzaj … dlatego powinieneś dokonać wyboru, której z nich użyć. na podstawie tego, jakie zachowanie buforowania faktycznie chcesz osiągnąć w praktyce…
CBroe
Przeczytaj greenbytes.de/tech/webdav/ ... i zobacz, czy to wyjaśnia wszystko.
Julian Reschke
sprawdź to drzewo decyzyjne, aby znaleźć odpowiedź stackoverflow.com/a/49925190/3748498
pravdomil Kwietnia

Odpowiedzi:

191

Myślę, że must-revalidateto oznacza:

Po wygaśnięciu pamięci podręcznej odmawiaj zwracania nieaktualnych odpowiedzi użytkownikowi, nawet jeśli twierdzą, że nieaktualne odpowiedzi są dopuszczalne.

Mając na uwadze, że no-cacheimplikuje:

must-revalidate plus fakt, że odpowiedź od razu staje się nieaktualna.

Jeśli odpowiedź można zapisać w pamięci podręcznej przez 10 sekund, must-revalidatewłącza się po 10 sekundach, podczas gdy no-cacheimplikuje must-revalidatepo 0 sekundach.

Przynajmniej taka jest moja interpretacja.

Gili
źródło
2
Tak to teraz widzę. Interesującą częścią jest mój ostatni paragraf, bez ETag lub Last-Modified, agent nie ma nic do sprawdzenia, co ma w pamięci podręcznej i musi ponownie pobrać cały ładunek. Więc kiedy RFC mówi „rewaliduj”, to prawdopodobnie oznacza, ponownie pobierz.
Luke Puplett
44
Co również oznacza max-age=0, must-revalidatei no-cachesą identyczne
Anshul
5
@Anshul, na początku myślałem, że masz rację, że „max-age = 0, must-revalidate i no-cache są identyczne”, ale zobacz odpowiedź Jeffreya Foxa, która wydaje się wskazywać, że to nie do końca prawda.
Don Hatch
2
@Anshul Nie, must-revalidatei no-cachemają inne znaczenie dla świeżych odpowiedzi: Jeśli odpowiedź w pamięci podręcznej jest świeża (tj. Odpowiedź nie wygasła), must-revalidateserwer proxy będzie ją obsługiwał od razu bez ponownej walidacji z serwerem, podczas gdy z no-cacheproxy musi ponownie zweryfikować odpowiedź w pamięci podręcznej niezależnie od aktualności. Źródło: „HTTP - The Definitive Guide”, strony 182–183.
Matthias Braun
8
@MatthiasBraun Ach, widzę źródło zamieszania. Może powinienem był napisać no-cachei max-age=0, must-revalidatesą identyczne
Anshul
24

max-age=0, must-revalidatei no-cachenie są dokładnie identyczne. Dzięki must-revalidate, jeśli serwer nie odpowiada na żądanie rewalidacji, przeglądarka / proxy ma zwracać błąd 504. Po no-cacheprostu pokazałby zawartość z pamięci podręcznej, co prawdopodobnie byłoby preferowane przez użytkownika (lepiej mieć coś nieaktualnego niż nic). Dlatego must-revalidatejest przeznaczony tylko do transakcji krytycznych.

Jeffrey Fox
źródło
10
Nie jestem pewien swojej no-cacheinterpretacji. Z dokumentu RFC 7234 Dyrektywa odpowiedzi „no-cache” wskazuje, że odpowiedź NIE MOŻE być używana do spełnienia kolejnego żądania bez pomyślnej weryfikacji na serwerze pochodzenia. Umożliwia to serwerowi pochodzenia zapobieganie używaniu go przez pamięć podręczną w celu spełnienia żądania bez kontaktowania się z nim, nawet przez pamięci podręczne, które zostały skonfigurowane do wysyłania nieaktualnych odpowiedzi. To brzmi podobnie do ograniczeń dlamust-revalidate
Anshul,
9
Czy Jeffrey ma dowody na to, że implementacje zachowują się tak, jak opisał?
OrangeDog
Myślę, że ta odpowiedź jest poprawna dla serwerów proxy / lb. Ale rzeczywiście, przeglądarki w takim przypadku nie zwracają kodu 504.
Yann Dìnendal
To must-validateznaczymust-refresh
Simon_Weaver
15

Z interpretacją Jeffreya Foxa dotyczącą tego no-cache, że testowałem pod chrome 52.0.2743.116 m, wynik pokazuje, że no-cachezachowuje się tak samo, jak must-revalidate, wszyscy NIE używają lokalnej pamięci podręcznej, gdy serwer jest nieosiągalny, i wszyscy będą używać pamięci podręcznej podczas dotykania przeglądarki Wstecz / Dalej przycisk, gdy serwer jest nieosiągalny. Jak powyżej, myślę, że max-age=0, must-revalidatejest identyczny no-cache, przynajmniej w realizacji.

Wilson Zeng
źródło
Czy Chrome użyje lokalnej pamięci podręcznej, gdy serwer będzie gotowy do ponownej walidacji? (tj. „Jeśli-zmodyfikowano-od”). W obu przypadkach?
Rich
-2

Myślę, że istnieje różnica między max-age=0, must-revalidatea no-cache:

W must-revalidateprzypadku, gdy klient może wysłać If-Modified-Sinceżądanie i podać odpowiedź z pamięci podręcznej, jeśli 304 Not Modifiedzostanie zwrócona.

W takim no-cacheprzypadku klient nie może buforować odpowiedzi, więc nie powinien używać If-Modified-Since.

Bogaty
źródło
6
Ale no-cacheto nie znaczy no-store- w no-cacheprzypadku zasobu można nadal buforować w kliencie; po prostu musi zostać ponownie zweryfikowana przed użyciem?
Aron,
4
Łączysz się no-cachei no-store. no-cacheoznacza, że ​​zasób MUSI zostać ponownie zatwierdzony . Revalidate zawiera opcję używania żądań warunkowych, takich jak If-None-Matchi If-Modified-Since.
Jules Sam. Randolph
1
@JulesRandolph: możesz mieć rację. Czy masz jakieś testy / dema? Wszystkie sprzeczne twierdzenia bez dowodów na ten temat są frustrujące. Nawet przyjęta odpowiedź mówi tylko: „Przynajmniej taka jest moja interpretacja”. Mogę ustawić łóżko testowe i umieścić je tutaj, jeśli będę miał trochę czasu.
Rich