Einführung
Der richtige Mindestsatz an Headern, der für alle genannten Clients (und Proxys) funktioniert:
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Das Cache-Control
ist für die HTTP 1.1 - Spezifikation für Clients und Proxies (und implizit von einigen Kunden neben erforderlich Expires
). Das Pragma
ist für die HTTP 1.0 - Spezifikation für prähistorische Kunden. Das Expires
ist per HTTP 1.0 und 1.1 Spezifikationen für Clients und Proxies. In HTTP 1.1 hat das Cache-Control
Vorrang vor Expires
HTTP 1.0, also nur für HTTP 1.0-Proxys.
Wenn Sie sich nicht für IE6 und dessen fehlerhaftes Caching interessieren, wenn Sie Seiten nur über HTTPS bereitstellen no-store
, können Sie dies weglassen Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Wenn Sie sich nicht für IE6- oder HTTP 1.0-Clients interessieren (HTTP 1.1 wurde 1997 eingeführt), können Sie dies weglassen Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Wenn Sie sich auch nicht für HTTP 1.0-Proxys interessieren, können Sie dies weglassen Expires
.
Cache-Control: no-store, must-revalidate
Wenn der Server hingegen automatisch einen gültigen Date
Header enthält, können Sie ihn theoretisch auch weglassen Cache-Control
und sich Expires
nur darauf verlassen.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Dies kann jedoch fehlschlagen, wenn z. B. der Endbenutzer das Datum des Betriebssystems manipuliert und die Client-Software darauf vertraut.
Andere Cache-Control
Parameter wie max-age
sind irrelevant, wenn die oben genannten Cache-Control
Parameter angegeben werden. Der Last-Modified
Header, wie er in den meisten anderen Antworten hier enthalten ist, ist nur dann interessant, wenn Sie die Anforderung tatsächlich zwischenspeichern möchten , sodass Sie sie überhaupt nicht angeben müssen.
Wie stelle ich es ein?
Verwenden von PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Verwenden von Java Servlet oder 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.
Verwenden von 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.
Verwenden der ASP.NET-Web-API:
// `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());
Verwenden von 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.
Verwenden von 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";
Verwenden von 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.
Verwenden von Ruby on Rails oder 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.
Verwenden von 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.
Verwenden von Python / Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Verwenden von 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.
Verwenden der Apache- .htaccess
Datei:
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
Verwenden von 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">
HTML-Meta-Tags im Vergleich zu HTTP-Antwortheadern
Es ist wichtig zu wissen, dass, wenn eine HTML-Seite über eine HTTP-Verbindung bereitgestellt wird und sowohl in den HTTP-Antwortheadern als auch in den HTML- <meta http-equiv>
Tags ein Header vorhanden ist, der im HTTP-Antwortheader angegebene den Vorrang vor dem HTML-Meta-Tag hat. Das HTML-Meta-Tag wird nur verwendet, wenn die Seite von einem lokalen Datenträger-Dateisystem über eine file://
URL angezeigt wird . Siehe auch W3 HTML-Spezifikation Kapitel 5.2.2 . Seien Sie vorsichtig, wenn Sie sie nicht programmgesteuert angeben, da der Webserver nämlich einige Standardwerte enthalten kann.
Im Allgemeinen sollten Sie die HTML-Meta-Tags nicht angeben, um Verwirrung durch Starter zu vermeiden, und sich auf harte HTTP-Antwortheader verlassen. Darüber hinaus sind speziell diese <meta http-equiv>
Tags in HTML5 ungültig . Es sind nur die http-equiv
in der HTML5-Spezifikation aufgeführten Werte zulässig.
Überprüfen der tatsächlichen HTTP-Antwortheader
Um das eine oder andere zu überprüfen, können Sie sie im HTTP-Verkehrsmonitor des Entwickler-Toolset von Webbrowser anzeigen / debuggen. Sie können dorthin gelangen, indem Sie in Chrome / Firefox23 + / IE9 + F12 drücken, dann die Registerkarte "Netzwerk" oder "Netz" öffnen und dann auf die gewünschte HTTP-Anforderung klicken, um alle Details zur HTTP-Anforderung und -Antwort anzuzeigen. Der folgende Screenshot stammt von Chrome:
Ich möchte diese Header auch für Dateidownloads festlegen
Diese Frage und Antwort richtet sich zunächst auf "Webseiten" (HTML-Seiten) und nicht auf "Dateidownloads" (PDF, Zip, Excel usw.). Sie sollten sie zwischenspeichern lassen und eine Dateiversionskennung irgendwo im URI-Pfad oder im Querystring verwenden, um ein erneutes Herunterladen einer geänderten Datei zu erzwingen. Wenn Sie diese No-Cache-Header ohnehin auf Dateidownloads anwenden, achten Sie auf den IE7 / 8-Fehler, wenn Sie einen Dateidownload über HTTPS anstelle von HTTP bereitstellen. Weitere Informationen finden Sie unter IE kann foo.jsf nicht herunterladen. IE konnte diese Internetseite nicht öffnen. Die angeforderte Site ist entweder nicht verfügbar oder kann nicht gefunden werden .