Czy Chrome ignoruje Cache-Control: max-age?

Background:

  • IIS 7
  • AspNet 3.5 web app

Chrome Dev tools wyświetla 98 żądań dla strony głównej aplikacji internetowej (aspx + js + css + images). W następujących żądaniach kod stanu to 200 dla plików css / images. Brak informacji o pamięci podręcznej, przeglądarka pyta serwer za każdym razem, czy plik ma być aktualizowany. OK.

W IIS 7 ustawiłem nagłówek HTTP dla cache control, ustawiony na 6 godzin dla folderu "ressources". W Chrome, używając narzędzi dev, widzę, że nagłówek jest dobrze ustawiony w odpowiedź:

Cache-Control: max-age=21600
Ale wciąż dostaję 98 próśb... Pomyślałem, że przeglądarka nie powinna żądać jednego ressource, jeśli jej data wygaśnięcia nie zostanie osiągnięta, i spodziewałem się, że liczba żądań spadnie...
Author: Robert Moore, 2012-06-28

5 answers

Mam to. Google Chrome ignoruje nagłówek Cache-Control lub Expires, jeśli złożysz żądanie bezpośrednio po kolejnym żądaniu na ten sam URI w tej samej karcie (klikając przycisk Odśwież, naciskając klawisz F5 lub naciskając polecenie + R ). Prawdopodobnie ma algorytm, który odgadnie, co naprawdę chce zrobić użytkownik.

Sposobem na przetestowanie nagłówka Cache-Control jest zwrócenie dokumentu HTML z linkiem do siebie. Po kliknięciu w link Chrome wyświetla dokument z cache. Np. wymień następujący dokument self.html :

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test Page</title>
</head>
<body>
    <p>
        <a href="self.html">Link to the same page.</a>
        If correctly cached, a request should not be made
        when clicking the link.
    </p>
</body>
</html>

Inną opcją jest skopiowanie adresu URL i wklejenie go w tej samej karcie lub innej karcie.

Aktualizacja : w poście Chrome opublikowanym 26 stycznia 2017 r. opisano, jakie było poprzednie zachowanie i jak się zmienia, wykonując tylko przedłużenie ważności głównego zasobu, ale nie sub-zasobów:

Użytkownicy zazwyczaj przeładowują, ponieważ strona jest zepsuty lub zawartość wydaje się czerstwy. Istniejące przeładowanie zazwyczaj rozwiązuje uszkodzone strony, ale Nieświeża zawartość jest nieefektywnie usuwana przez regularne przeładowanie, szczególnie na urządzeniach mobilnych. Ta funkcja została pierwotnie zaprojektowana w czasach, gdy uszkodzone strony były dość powszechne, więc rozsądne było zajęcie się obydwoma przypadkami użycia na raz. Jednak ta pierwotna troska stała się teraz znacznie mniej istotna, ponieważ jakość stron internetowych wzrosła. Aby ulepszyć Stary przypadek użycia zawartości, Chrome ma teraz uproszczony przeładuj zachowanie, aby tylko zweryfikować główny zasób i kontynuować regularne ładowanie strony. To nowe zachowanie maksymalizuje ponowne wykorzystanie zasobów pamięci podręcznej i powoduje mniejsze opóźnienia, zużycie energii i zużycie danych.

W poście Facebook również opublikowany w styczniu 26, 2017 , jest wspomniane, że znaleźli kawałek kodu zostały Chrome unieważnia wszystkie zasoby pamięci podręcznej po żądaniu posta:

Okazało się, że Chrome będzie aktualizować wszystkie zasoby na stronach, które zostały załadowane od złożenia żądania POST. Zespół Chrome powiedział nam, że powodem tego było to, że żądania postów są zazwyczaj stronami, które zmieniają-jak dokonanie zakupu lub wysłanie wiadomości e - mail-i że użytkownik chciałby mieć najbardziej aktualną stronę.

Wygląda na to, że tak już nie jest. Firefox wprowadza Cache-Control: immutable, aby całkowicie zaprzestać przedłużania ważności zasobów:

Firefox wdrożył propozycję od jednego z naszych inżynierów, aby dodać nowy nagłówek Cache-control dla niektórych zasobów, aby powiedzieć przeglądarce, że ten zasób nigdy nie powinien być odnawiany. Idea tego nagłówka polega na tym, że jest to dodatkowa obietnica od dewelopera do przeglądarki, że zasób ten nigdy się nie zmieni podczas swojego maksymalnego wieku życia. Firefox zdecydował się zaimplementować tę dyrektywę w postaci nagłówka cache-control: immutable.

Mam nadzieję, że to pomoże rozwikłać tajemnice przeładowania.
 52
Author: kiewic,
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-01-28 18:43:45

Wygląda na to, że Chrome ignoruje Twoje ustawienia Cache-Control, Jeśli przeładowujesz na tej samej karcie. Jeśli skopiujesz adres URL do nowej karty i załadujesz go tam, Chrome będzie respektował znaczniki kontroli pamięci podręcznej i ponownie wykorzysta zawartość z pamięci podręcznej.

Jako przykład miałem aplikację Ruby Sinatra:

#!/usr/bin/env ruby

require 'sinatra'

before do
  content_type :txt
end

get '/' do
  headers "Cache-Control" => "public, must-revalidate, max-age=3600",
          "Expires" => Time.at(Time.now.to_i + (60 * 60)).to_s
  "This page rendered at #{Time.now}."
end

Gdy ciągle ładowałem go w tej samej zakładce Chrome, wyświetlał nowy czas.

This page rendered at 2014-10-08 13:36:46 -0400.
This page rendered at 2014-10-08 13:36:48 -0400.

Nagłówki wyglądały tak:

< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=utf-8
< Cache-Control: public, must-revalidate, max-age=3600
< Expires: 2014-10-08 13:36:46 -0400
< Content-Length: 48
< X-Content-Type-Options: nosniff
< Connection: keep-alive
* Server thin is not blacklisted
< Server: thin

Jednak dostęp do tego samego adresu URL, http://localhost:4567/ z wiele nowych kart spowoduje ponowne przetworzenie poprzedniego wyniku z pamięci podręcznej.

 13
Author: slm,
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
2014-10-08 17:44:31

Po wykonaniu kilku testów z Cache-Control:max-age=xxx:

  • naciśnięcie przycisku reload: header ignored
  • wpisanie tego samego adresu URL dowolnej zakładki (bieżącej lub nie):
  • używanie JS (window.location.reload()): ignored
  • korzystanie z narzędzi programistycznych (z wyłączoną pamięcią podręczną bez zaznaczenia) lub incognito nie wpływa

Więc najlepszą opcją podczas tworzenia jest Umieść kursor w omnibox i naciśnij enter zamiast przycisku Odśwież.

Uwaga : prawo kliknięcie przycisku na ikonę Odśwież wyświetli opcje odświeżania (normalny, twardy, pusty Bufor). Niewiarygodnie, nikt z nich nie wpływa na te nagłówki.

 9
Author: sinuhepop,
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-12-15 16:41:09

Jeśli narzędzia programistyczne Chrome są otwarte (F12), Chrome Zwykle wyłącza buforowanie.

Można go kontrolować w Ustawieniach narzędzi programistycznych-ikona koła zębatego po prawej stronie górnego paska narzędzi programistycznych.

 8
Author: user3841754,
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
2014-07-15 16:10:54

Kolejna wskazówka:

Nie zapomnij zweryfikować nagłówka "Data" - jeśli serwer ma nieprawidłową datę/czas (lub znajduje się w innej strefie czasowej) - Chrome będzie nadal żądać zasobów ponownie i ponownie.

 1
Author: kolobok,
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-06 09:42:52