1880 Stimmen

Wie können wir die Zwischenspeicherung von Webseiten in allen Browsern kontrollieren?

Unsere Untersuchungen haben gezeigt, dass nicht alle Browser die HTTP-Cache-Direktiven in einheitlicher Weise beachten.

Aus Sicherheitsgründen wollen wir nicht, dass bestimmte Seiten in unserer Anwendung zwischengespeichert werden, jemals, durch den Webbrowser. Dies muss mindestens mit den folgenden Browsern funktionieren:

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrom

Unsere Anforderung kam von einem Sicherheitstest. Nach dem Abmelden von unserer Website konnte man die Schaltfläche "Zurück" drücken und zwischengespeicherte Seiten anzeigen.

3119voto

BalusC Punkte 1034465

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:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

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 .

283voto

Kornel Punkte 94135

(Hey, Leute: bitte kopiert nicht einfach gedankenlos alle Überschriften, die ihr finden könnt)

Zuallererst, Zurück-Taste Geschichte ist kein Cache :

Das Freshness-Modell (Abschnitt 4.2) gilt nicht unbedingt für History-Mechanismen. Das heißt, ein History-Mechanismus kann eine frühere Darstellung anzeigen, auch wenn diese abgelaufen ist.

In der alten HTTP-Spezifikation war der Wortlaut sogar noch deutlicher und wies die Browser ausdrücklich an, die Cache-Anweisungen für den Verlauf der Zurück-Schaltfläche zu ignorieren.

Zurück soll in der Zeit zurückgehen (zu dem Zeitpunkt, an dem der Benutzer war eingeloggt). Es wird nicht zu einer zuvor geöffneten URL weitergesprungen.

In der Praxis kann der Cache jedoch unter ganz bestimmten Umständen die Zurück-Taste beeinflussen:

  • Seite muss geliefert werden über HTTPS sonst ist das Cache-Busting nicht zuverlässig. Und wenn Sie kein HTTPS verwenden, ist Ihre Seite auch auf viele andere Arten anfällig für Login-Diebstahl.
  • Sie müssen Folgendes senden Cache-Control: no-store, must-revalidate (einige Browser beobachten no-store und einige beobachten must-revalidate )

Sie niemals benötigen:

  • <meta> mit Cache-Headern - es funktioniert überhaupt nicht. Völlig nutzlos.
  • post-check / pre-check - Es handelt sich um eine reine IE-Richtlinie, die nur für abrufbar Ressourcen.
  • Die gleiche Kopfzeile wird zweimal oder in Dutzenden von Teilen gesendet. Einige PHP-Snippets ersetzen frühere Header, so dass nur der letzte gesendet wird.

Wenn Sie wollen, können Sie hinzufügen:

  • no-cache o max-age=0 , wodurch die Ressource (URL) "veraltet" wird und die Browser beim Server prüfen müssen, ob es eine neuere Version gibt ( no-store impliziert dies bereits noch stärker).
  • Expires mit einem Datum in der Vergangenheit für HTTP/1.0-Clients (obwohl real Reine HTTP/1.0-Clients gibt es heutzutage überhaupt nicht mehr).

Bonus: Der neue HTTP-Caching-RFC .

129voto

Pacerier Punkte 80774

Wie @Kornel schon sagte, wollen Sie nicht den Cache deaktivieren, sondern den Verlaufspuffer deaktivieren. Verschiedene Browser haben ihre eigenen subtilen Möglichkeiten, den Verlaufspuffer zu deaktivieren.

In Chrome (v28.0.1500.95 m) können wir dies nur tun, indem wir Cache-Control: no-store .

In FireFox (v23.0.1) funktioniert jede dieser Optionen:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (nur https)

  3. Pragma: no-cache (nur https)

  4. Vary: * (nur https)

In Opera (v12.15) können wir dies nur tun, indem wir Cache-Control: must-revalidate (nur https).

In Safari (v5.1.7, 7534.57.2) funktioniert jede dieser Optionen:

  1. Cache-Control: no-store
    <body onunload=""> in html

  2. Cache-Control: no-store (nur https)

Im IE8 (v8.0.6001.18702IC) funktioniert jede dieser Optionen:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (nur https)

  7. Vary: * (nur https)

Durch die Kombination der oben genannten Methoden erhalten wir diese Lösung, die für Chrome 28, FireFox 23, IE8, Safari 5.1.7 und Opera 12.15 funktioniert: Cache-Control: no-store, must-revalidate (nur https)

Beachten Sie, dass https erforderlich ist, da Opera den Verlaufspuffer für einfache http-Seiten nicht deaktivieren würde. Wenn Sie wirklich nicht https bekommen können und bereit sind, Opera zu ignorieren, ist das Beste, was Sie tun können, dies:

Cache-Control: no-store
<body onunload="">

Nachstehend finden Sie die Rohprotokolle meiner Tests:

HTTP:

  1. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Opera 12.15
    Erfolgreich: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  2. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Opera 12.15
    Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  3. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Scheitern: Safari 5.1.7, Opera 12.15
    Erfolg: Chrome 28, FireFox 23, IE8

  4. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Scheitern: Safari 5.1.7, Opera 12.15
    Erfolgreich: Chrome 28, FireFox 23, IE8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Versagen: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  6. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  8. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  9. Cache-Control: no-store
    Scheitern: Safari 5.1.7, Opera 12.15
    Erfolgreich: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Scheitern: Opera 12.15
    Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  12. Vary: *
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Erfolg: keiner

  13. Pragma: no-cache
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Erfolg: keiner

  14. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Versagen: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Erfolg: keiner

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Erfolg: keiner

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Erfolg: keiner

  3. Vary: *
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolg: FireFox 23, IE8

  4. Pragma: no-cache
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolg: FireFox 23, IE8

  5. Cache-Control: no-cache
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolg: FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolgreich: FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolg: FireFox 23, IE8

  8. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolgreich: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Erfolg: Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Erfolg: Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7
    Erfolg: IE8, Opera 12.15

  12. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, Safari 5.1.7
    Erfolg: FireFox 23, IE8, Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Chrome 28, Safari 5.1.7
    Erfolg: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Scheitern: Opera 12.15
    Erfolgreich: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Opera 12.15
    Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  16. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Scheitern: Opera 12.15
    Erfolgreich: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Scheitern: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolgreich: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7,
    Erfolg: IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7,
    Erfolg: IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7,
    Erfolg: IE8, Opera 12.15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Scheitern: Chrome 28, FireFox 23, Safari 5.1.7,
    Erfolg: IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Scheitern: Chrome 28, Safari 5.1.7
    Erfolgreich: FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Fail: keine
    Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

51voto

Joseph Connolly Punkte 748

Ich fand die web.config-Route nützlich (ich habe versucht, sie der Antwort hinzuzufügen, aber sie scheint nicht akzeptiert worden zu sein, also poste ich sie hier)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

Und hier ist der express / node.js Weg, das gleiche zu tun:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});

38voto

Chris Vasselli Punkte 12494

Ich habe festgestellt, dass alle Antworten auf dieser Seite immer noch Probleme aufweisen. Insbesondere ist mir aufgefallen, dass keine von ihnen den IE8 davon abhält, eine zwischengespeicherte Version der Seite zu verwenden, wenn man sie durch Drücken der Schaltfläche "Zurück" aufruft.

Nach vielen Recherchen und Tests fand ich heraus, dass ich nur zwei Kopfzeilen benötigte:

Cache-Kontrolle: no-store
Vary: *

Eine Erklärung des Vary-Headers finden Sie unter http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

Bei IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 und Opera 9-10 führten diese Header dazu, dass die Seite vom Server angefordert wurde, wenn Sie auf einen Link zur Seite klickten oder die URL direkt in die Adressleiste eingaben. Das deckt etwa 99% aller verwendeten Browser (Stand: Januar '10).

Im IE6 und in Opera 9-10 wurde bei Betätigung der Schaltfläche "Zurück" immer noch die im Cache gespeicherte Version geladen. Bei allen anderen von mir getesteten Browsern wurde eine neue Version vom Server abgerufen. Bisher habe ich keine Kopfzeilen gefunden, die dazu führen, dass diese Browser keine zwischengespeicherten Versionen von Seiten zurückgeben, wenn Sie auf die Schaltfläche "Zurück" klicken.

Aktualisierung: Nachdem ich diese Antwort geschrieben hatte, stellte ich fest, dass unser Webserver sich als HTTP 1.0-Server identifiziert. Die Header, die ich aufgelistet habe, sind die richtigen, damit Antworten von einem HTTP 1.0 Server nicht von Browsern zwischengespeichert werden. Für einen HTTP 1.1 Server, schauen Sie sich BalusC's Antwort .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X