Odpowiedzi:
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-Control
Nagłó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”).
Wierzę, że max-age=0
po 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-Modified
nagłówkiem) przed użyciem kopii w pamięci podręcznej, a jednocześnie no-cache
powiedzieć 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ć Warning
nagłówek), ale no-cache
twierdzi, ż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-cache
nie 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-revalidate
powinno 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-cache
do robienia tego samego, co no-store
(tj. Bez buforowania)?
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-Modified
nagłó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.
must-revalidate
nie ma być taki sam jak no-cache
lub 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.
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ą.
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.
no-store
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 .
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-cache
odpowiedzi z taką samą semantyką jak max-age=0,must-revalidate
. Firefox 3.5 wydaje się jednak traktować no-cache
jako 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-cache
nagłówkiem, tak jak Firefox.
Moją radą byłoby wybranie public,max-age=0
niewraż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-cache
cał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=0
lub no-cache
losowo w zależności od zasobu.
private,max-age=0
.
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 :)
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=0
pamięć 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-cache
nie .
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ą.
Jedną rzeczą, o której (niespodziewanie) nie wspomniano, jest to, że żądanie może jednoznacznie wskazać, że zaakceptuje nieaktualne dane, korzystając z max-stale
dyrektywy. 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-cache
to naprawdę przebija każde żądanie klienta (z max-stale
) o nieaktualne dane, ponieważ pamięć podręczna MUSI zostać ponownie sprawdzona.
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.
max-age=0
jeśli masz na myśli, że buforowanie jest dozwolone, ale zasób powinien zostać ponownie sprawdzony i no-store
jeśli nie chcesz, aby odpowiedź była w ogóle przechowywana w pamięci podręcznej. no-cache
Jest losowo wyznaczone oznaczać jeden z nich w zależności od dostawcy agenta użytkownika i numer wersji i protokół transmisji.