Wprowadzenie
Prawidłowy minimalny zestaw nagłówków, który działa na wszystkich wymienionych klientach (i serwerach proxy):
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Jest Cache-Control
to zgodne ze specyfikacją HTTP 1.1 dla klientów i serwerów proxy (i domyślnie wymagane przez niektórych klientów obok Expires
). Jest Pragma
to zgodne ze specyfikacją HTTP 1.0 dla klientów prehistorycznych. TheExpires
to zgodne ze specyfikacjami HTTP 1.0 i 1.1 dla klientów i serwerów proxy. W HTTP 1.1 Cache-Control
ma pierwszeństwo przed Expires
, więc w końcu dotyczy tylko serwerów proxy HTTP 1.0.
Jeśli nie obchodzi Cię IE6 i jego zepsute buforowanie, gdy wyświetlasz strony tylko przez HTTPS no-store
udostępniania , możesz to pominąć Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Jeśli nie przejmujesz się klientami IE6 ani HTTP 1.0 (HTTP 1.1 został wprowadzony w 1997 r.), Możesz to pominąć Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Jeśli nie obchodzą Cię również proxy HTTP 1.0, możesz to pominąć Expires
.
Cache-Control: no-store, must-revalidate
Z drugiej strony, jeśli serwer automatycznie zawiera poprawny Date
nagłówek, to teoretycznie możesz też pominąć Cache-Control
i polegać naExpires
tylko na.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Ale może się to nie powieść, jeśli np. Użytkownik końcowy manipuluje datą systemu operacyjnego, a oprogramowanie klienckie na niej polega.
Inne Cache-Control
parametry, takie jak max-age
nieistotne, jeśli Cache-Control
zostaną określone wyżej wymienione parametry. Last-Modified
Nagłówek jak zawarte w większości innych odpowiedzi tutaj jest tylko interesujące, jeśli rzeczywiście chcemy buforować żądanie, dzięki czemu nie trzeba określić go wcale.
Jak to ustawić?
Za pomocą PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Za pomocą Java Servlet lub Node.js:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
Korzystanie z ASP.NET-MVC
Response.Cache.SetCacheability(HttpCacheability.NoCache); // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Za pomocą interfejsu API sieci Web ASP.NET:
// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
NoCache = true,
NoStore = true,
MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString());
Za pomocą ASP.NET:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Korzystanie z ASP.NET Core v3
// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";
Korzystanie z ASP:
Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.
Korzystanie z Ruby on Rails lub Python / Flask:
headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.
Za pomocą Python / Django:
response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.
Za pomocą Python / Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Za pomocą Go:
responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.
Za pomocą .htaccess
pliku Apache :
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
Za pomocą HTML4:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
Metatagi HTML a nagłówki odpowiedzi HTTP
Ważne jest, aby wiedzieć, że gdy strona HTML jest obsługiwana przez połączenie HTTP, a nagłówek jest obecny zarówno w nagłówkach odpowiedzi HTTP, jak i <meta http-equiv>
znacznikach HTML , wówczas określony w nagłówku odpowiedzi HTTP uzyska pierwszeństwo przed metatagiem HTML. Metatag HTML zostanie użyty tylko wtedy, gdy strona zostanie wyświetlona z lokalnego systemu plików dysku za pośrednictwem file://
adresu URL. Zobacz także rozdział 5.2.2 specyfikacji HTML W3 . Zachowaj ostrożność, gdy nie określisz ich programowo, ponieważ serwer WWW może mianowicie zawierać pewne wartości domyślne.
Ogólnie rzecz biorąc, lepiej nie podawać metatagów HTML, aby uniknąć pomyłek przez osoby rozpoczynające i polegać na twardych nagłówkach odpowiedzi HTTP. Co więcej, w szczególności te <meta http-equiv>
tagi są nieprawidłowe w HTML5. Tylko http-equiv
wartości wymienione w specyfikacji HTML5 .
Weryfikacja rzeczywistych nagłówków odpowiedzi HTTP
Aby zweryfikować jedno i drugie, można je zobaczyć / debugować w monitorze ruchu HTTP zestawu narzędzi programistycznych przeglądarki internetowej. Możesz się tam dostać, naciskając klawisz F12 w przeglądarce Chrome / Firefox23 + / IE9 +, a następnie otwierając panel karty „Sieć” lub „Sieć”, a następnie klikając interesujące żądanie HTTP, aby wyświetlić wszystkie szczegóły dotyczące żądania i odpowiedzi HTTP. Poniżej zrzut ekranu jest z Chrome:
Chcę również ustawić te nagłówki w plikach do pobrania
Przede wszystkim to pytanie i odpowiedź są skierowane na „strony internetowe” (strony HTML), a nie „pliki do pobrania” (PDF, zip, Excel itp.). Lepiej je buforuj i użyj jakiegoś identyfikatora wersji pliku gdzieś na ścieżce URI lub w zapytaniu, aby wymusić ponowne pobranie zmienionego pliku. Przy stosowaniu tych nagłówków no-cache przy pobieraniu plików, uważaj na błąd IE7 / 8, gdy podajesz pobieranie pliku przez HTTPS zamiast HTTP. Aby uzyskać szczegółowe informacje, zobacz IE nie może pobrać foo.jsf. IE nie mógł otworzyć tej strony internetowej. Żądana witryna jest niedostępna lub nie można jej znaleźć .