Einführung
Der korrekte Mindestsatz an Kopfzeilen, der bei allen genannten Clients (und Proxys) funktioniert:
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
El Cache-Control
ist gemäß der HTTP 1.1-Spezifikation für Clients und Proxies (und wird von einigen Clients implizit neben Expires
). Die Website Pragma
entspricht der Spezifikation HTTP 1.0 für prähistorische Clients. Die Expires
entspricht dem HTTP 1.0 Cache-Control
hat Vorrang vor Expires
Es ist also nur für HTTP 1.0 Proxies gedacht.
Wenn Sie sich nicht um den IE6 und sein fehlerhaftes Caching kümmern, wenn Sie Seiten über HTTPS mit nur no-store
dann könnten Sie Folgendes weglassen Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Wenn Sie sich weder um den IE6 noch um HTTP-1.0-Clients kümmern (HTTP 1.1 wurde 1997 eingeführt), können Sie die Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Wenn Sie sich auch nicht um HTTP 1.0-Proxys kümmern, dann können Sie die Expires
.
Cache-Control: no-store, must-revalidate
Andererseits, wenn der Server automatisch eine gültige Date
Kopfzeile, dann könnten Sie theoretisch weglassen Cache-Control
auch und verlassen sich auf Expires
nur.
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 sich darauf verlässt.
Andere Cache-Control
Parameter wie max-age
sind irrelevant, wenn die oben genannten Cache-Control
Parameter angegeben sind. Die Website Last-Modified
Kopfzeile wie in den meisten anderen Antworten hier enthalten ist nur interessant, wenn Sie eigentlich wollen um die Anfrage zwischenzuspeichern, so dass Sie sie nicht angeben müssen.
Wie wird sie eingestellt?
PHP verwenden:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Mit 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.
ASP.NET-MVC verwenden
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.
ASP.NET Web API verwenden:
// `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());
ASP.NET verwenden:
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.
ASP.NET Core v3 verwenden
// 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";
Mit 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.
Ruby on Rails verwenden:
headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.
Verwendung von Python/Flask:
response = make_response(render_template(...))
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response.headers["Pragma"] = "no-cache" # HTTP 1.0.
response.headers["Expires"] = "0" # Proxies.
Python/Django verwenden:
response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.
Verwendung von Python/Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Go verwenden:
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.
Verwendung von Clojure (require Ring utils):
(require '[ring.util.response :as r])
(-> response
(r/header "Cache-Control" "no-cache, no-store, must-revalidate")
(r/header "Pragma" "no-cache")
(r/header "Expires" 0))
Apache verwenden .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>
HTML verwenden:
<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 vs. HTTP-Antwort-Header
Es ist wichtig zu wissen, dass, wenn eine HTML-Seite über eine HTTP-Verbindung bereitgestellt wird und ein Header in beide die HTTP-Antwort-Header und den HTML-Code <meta http-equiv>
Tags, dann hat der im HTTP-Antwort-Header angegebene Tag Vorrang vor dem HTML-Meta-Tag. Das HTML-Meta-Tag wird nur verwendet, wenn die Seite von einem lokalen Dateisystem aus über eine file://
URL. Siehe auch W3 HTML-Spezifikation Kapitel 5.2.2 . Seien Sie damit vorsichtig, wenn Sie sie nicht programmatisch angeben, denn der Webserver kann nämlich einige Standardwerte enthalten.
Im Allgemeinen ist es besser, wenn Sie einfach no die HTML-Meta-Tags angeben, um Verwechslungen durch Starter zu vermeiden, und sich auf harte HTTP-Antwort-Header verlassen. Außerdem werden speziell die <meta http-equiv>
Tags sind ungültig in HTML5. Nur die http-equiv
Werte aufgelistet in HTML5-Spezifikation sind erlaubt.
Überprüfung der tatsächlichen HTTP-Antwort-Header
Um das eine und das andere zu überprüfen, können Sie sie im HTTP-Verkehrsmonitor des Entwickler-Toolsets des Webbrowsers sehen/debuggen. Sie gelangen dorthin, indem Sie in Chrome/Firefox23+/IE9+ die Taste F12 drücken, die Registerkarte "Netzwerk" oder "Netz" öffnen und dann auf die gewünschte HTTP-Anfrage klicken, um alle Details über die HTTP-Anfrage und -Antwort zu erfahren. Die Seite untenstehendes Bildschirmfoto ist von Chrome:
Ich möchte diese Kopfzeilen auch für Dateidownloads festlegen
Zunächst einmal beziehen sich diese Frage und die Antwort auf "Webseiten" (HTML-Seiten), nicht auf "Dateidownloads" (PDF, zip, Excel usw.). Es ist besser, sie in den Cache zu stellen und irgendwo im URI-Pfad oder im Query-String eine Dateiversionskennung zu verwenden, um einen erneuten Download bei einer geänderten Datei zu erzwingen. Wenn Sie diese No-Cache-Header trotzdem auf Dateidownloads anwenden, sollten Sie sich vor dem IE7/8-Fehler hüten, wenn Sie einen Dateidownload über HTTPS statt über HTTP anbieten. Für Details, siehe IE kann foo.jsf nicht herunterladen. Der IE konnte diese Internetseite nicht öffnen. Die angeforderte Seite ist entweder nicht verfügbar oder kann nicht gefunden werden .