Nagłówek Cache-Control: max-age=0
sugeruje, że treść jest uważana za przestarzałą (i należy ją ponownie pobrać) natychmiast, co w rzeczywistości jest tym samym co Cache-Control: no-cache
.
http
caching
http-headers
rubyruy
źródło
źródło
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”).Po wysłaniu przez serwer pochodzenia
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. ZIf-Not-Modified
nagłówkiem) przed użyciem kopii w pamięci podręcznej, a jednocześnieno-cache
powiedzieć im, że MUSZĄ dokonać ponownej weryfikacji przed użyciem buforowanej pamięci Kopiuj. Od 14.9.1 Co można buforować :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), aleno-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żywaniano-cache
. Natknąłem się na stronę, Dyrektywy kontroli pamięci podręcznej Demystified , która mówi (nie mogę ręczyć za jej poprawność):Nawiasem mówiąc, wydaje mi się, że
Cache-Control: max-age=0, must-revalidate
powinno to zasadniczo oznaczać to samo, coCache-Control: no-cache
. Więc może to jest sposób na uzyskanie MUSI - zweryfikować zachowanieno-cache
, jednocześnie unikając pozornej migracjino-cache
do robienia tego samego, cono-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. ZIf-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.źródło
must-revalidate
nie ma być taki sam jakno-cache
lubno-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.
źródło
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 .
źródło
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ą jakmax-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
lubno-cache
losowo w zależności od zasobu.źródło
private,max-age=0
.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 :)
źródło
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ą, aleno-cache
nie .źródło
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ą.
źródło
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łbymax-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 (zmax-stale
) o nieaktualne dane, ponieważ pamięć podręczna MUSI zostać ponownie sprawdzona.źródło
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.
źródło
max-age=0
jeśli masz na myśli, że buforowanie jest dozwolone, ale zasób powinien zostać ponownie sprawdzony ino-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.