Frage

Unsere Untersuchungen haben gezeigt, dass nicht alle Browser die HTTP-Cache-Anweisungen einheitlich respektieren.

Aus Sicherheitsgründen möchten wir nicht, dass bestimmte Seiten in unserer Anwendung zwischengespeichert werden. immer, durch den Webbrowser.Dies muss mindestens für die folgenden Browser funktionieren:

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

Unsere Anforderung ergab sich aus einem Sicherheitstest.Nachdem Sie sich von unserer Website abgemeldet haben, können Sie auf die Schaltfläche „Zurück“ klicken und zwischengespeicherte Seiten anzeigen.

War es hilfreich?

Lösung

Einführung

Der richtige Mindestsatz an Headern, der auf allen genannten Clients (und Proxys) funktioniert:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Der Cache-Control entspricht der HTTP 1.1-Spezifikation für Clients und Proxys (und wird von einigen Clients implizit benötigt). Expires).Der Pragma entspricht der HTTP 1.0-Spezifikation für prähistorische Clients.Der Expires entspricht der HTTP 1.0- und 1.1-Spezifikation für Clients und Proxys.In HTTP 1.1 ist die Cache-Control hat Vorrang Expires, also ist es schließlich nur für HTTP 1.0-Proxys.

Wenn Ihnen IE6 und sein defektes Caching egal sind, wenn Sie Seiten nur über HTTPS bereitstellen no-store, dann könnte man es 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 es 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 diese weglassen Expires.

Cache-Control: no-store, must-revalidate

Wenn der Server andererseits automatisch eine gültige Datei einschließt Date Header, dann könnte man theoretisch weglassen Cache-Control auch und verlassen Sie sich darauf Expires nur.

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

Dies kann jedoch scheitern, wenn z.B.Der Endbenutzer manipuliert das Betriebssystemdatum und die Client-Software verlässt sich darauf.

Andere Cache-Control Parameter wie z.B 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 nur interessant, wenn Sie eigentlich wollen um die Anfrage zwischenzuspeichern, sodass Sie sie überhaupt nicht angeben müssen.

Wie stelle ich es ein?

Verwendung 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.

Verwendung 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()); 

Verwendung 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.

Verwendung 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.

Mit 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.

Mit 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.

Verwendung von Python/Pyramid:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Mit 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.

Verwendung von 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>

Verwendung 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

Wichtig zu wissen ist, dass, wenn eine HTML-Seite über eine HTTP-Verbindung bereitgestellt wird und ein Header vorhanden ist beide die HTTP-Antwortheader und das HTML <meta http-equiv> Tags, dann hat das im HTTP-Antwortheader angegebene Tag Vorrang vor dem HTML-Meta-Tag.Das HTML-Meta-Tag wird nur verwendet, wenn die Seite über ein lokales Dateisystem auf der Festplatte angezeigt wird file:// URL.Siehe auch W3 HTML-Spezifikation Kapitel 5.2.2.Seien Sie dabei vorsichtig, wenn Sie sie nicht programmgesteuert angeben, da der Webserver nämlich einige Standardwerte enthalten kann.

Im Allgemeinen ist es besser, einfach nicht Geben Sie die HTML-Meta-Tags an, um Verwirrung durch Anfänger zu vermeiden, und verlassen Sie sich auf harte HTTP-Antwortheader.Darüber hinaus speziell diese <meta http-equiv> Tags sind ungültig in HTML5.Nur der http-equiv Werte aufgeführt in HTML5-Spezifikation sind erlaubt.

Überprüfen der tatsächlichen HTTP-Antwortheader

Um das eine und das andere zu überprüfen, können Sie sie im HTTP-Verkehrsmonitor des Entwickler-Toolsets des Webbrowsers 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-Anfrage klicken, um alle Details zur HTTP-Anfrage und -Antwort anzuzeigen.Der unten Screenshot ist aus Chrome:

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

Ich möchte diese Header auch bei Dateidownloads festlegen

Zunächst einmal bezieht sich diese Frage und Antwort auf „Webseiten“ (HTML-Seiten) und nicht auf „Dateidownloads“ (PDF, ZIP, Excel usw.).Sie sollten sie besser zwischenspeichern und eine Dateiversionskennung irgendwo im URI-Pfad oder in der Abfragezeichenfolge verwenden, um einen erneuten Download einer geänderten Datei zu erzwingen.Wenn Sie diese No-Cache-Header ohnehin auf Dateidownloads anwenden, achten Sie auf den IE7/8-Fehler, wenn ein Dateidownload über HTTPS statt über HTTP bereitgestellt wird.Einzelheiten 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.

Andere Tipps

(Hallo alle miteinander:Bitte kopieren Sie nicht einfach gedankenlos alle Header, die Sie finden können.)

Erstens, Der Verlauf der Zurück-Schaltfläche ist kein Cache:

Das Frischemodell (Abschnitt 4.2) gilt nicht unbedingt für Verlaufsmechanismen.Das heißt, ein Verlaufsmechanismus kann eine frühere Darstellung anzeigen, selbst wenn diese abgelaufen ist.

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

Back soll in der Zeit zurückgehen (zu dem Zeitpunkt, als der Benutzer War eingeloggt).Es wird nicht zu einer zuvor geöffneten URL weiternavigiert.

In der Praxis kann der Cache jedoch unter ganz bestimmten Umständen Einfluss auf die Zurück-Schaltfläche haben:

  • Seite muss überliefert werden HTTPS, andernfalls ist dieses Cache-Busting nicht zuverlässig.Wenn Sie außerdem kein HTTPS verwenden, ist Ihre Seite anfällig für Anmeldediebstahl auf viele andere Arten.
  • Sie müssen senden Cache-Control: no-store, must-revalidate (Einige Browser beobachten no-store und einige beobachten must-revalidate)

Du niemals brauche etwas von:

  • <meta> mit Cache-Headern – es funktioniert überhaupt nicht.Völlig nutzlos.
  • post-check/pre-check – Es handelt sich um eine reine IE-Direktive, die nur für gilt zwischenspeicherbar Ressourcen.
  • Derselbe Header wird zweimal oder in Dutzenden Teilen gesendet.Einige PHP-Snippets da draußen ersetzen tatsächlich vorherige Header, was dazu führt, dass nur der letzte gesendet wird.

Wenn Sie möchten, können Sie Folgendes hinzufügen:

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

Bonus: Der neue HTTP-Caching-RFC.

Wie porneL erklärte, möchten Sie nicht den Cache, 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 per tun Cache-Control: no-store.

In Firefox (v23.0.1) funktioniert Folgendes:

  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 Cache-Control: must-revalidate (nur https).

In Safari (v5.1.7, 7534.57.2) funktioniert Folgendes:

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

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

In IE8 (v8.0.6001.18702IC) funktioniert Folgendes:

  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 Punkte 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 deaktiviert.Wenn Sie https wirklich nicht bekommen können und bereit sind, Opera zu ignorieren, können Sie am besten Folgendes tun:

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

Unten sehen 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:Oper 12.15
    Erfolg: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:Oper 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
    Erfolg: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="">
    Scheitern: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
    Erfolg:Chrome 28, Firefox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Scheitern:Oper 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
    Scheitern: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
    Erfolg: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
    Erfolg:Firefox 23, IE8

  9. Cache-Control: must-revalidate
    Scheitern:Chrome 28, Firefox 23, IE8, Safari 5.1.7
    Erfolg:Oper 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:Oper 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:Oper 12.15
    Erfolg: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:Oper 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:Oper 12.15
    Erfolg: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
    Erfolg: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
    Erfolg:Firefox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Scheitern:keiner
    Erfolg:Chrome 28, Firefox 23, IE8, Safari 5.1.7, Opera 12.15

Ich fand die web.config-Route nützlich (habe versucht, sie zur Antwort hinzuzufügen, wurde aber anscheinend nicht akzeptiert, 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 die Methode von express / node.js, dasselbe 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();
});

Ich habe festgestellt, dass bei allen Antworten auf dieser Seite immer noch Probleme auftraten.Insbesondere ist mir aufgefallen, dass keiner von ihnen den IE8 daran hindern würde, eine zwischengespeicherte Version der Seite zu verwenden, wenn Sie über die Schaltfläche „Zurück“ darauf zugegriffen haben.

Nach vielen Recherchen und Tests habe ich herausgefunden, dass die einzigen zwei Header, die ich wirklich brauchte, waren:

Cache-Kontrolle:kein Laden
Variieren:*

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

In 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 eingegeben haben direkt in der Adressleiste.Das deckt etwa ab 99% aller seit Januar 2010 verwendeten Browser.

Unter IE6 und Opera 9–10 führte das Drücken der Zurück-Schaltfläche immer noch dazu, dass die zwischengespeicherte Version geladen wurde.Bei allen anderen von mir getesteten Browsern wurde eine neue Version vom Server abgerufen.Bisher habe ich keine Kopfzeilen gefunden, die dazu führen würden, dass diese Browser keine zwischengespeicherten Versionen von Seiten zurückgeben, wenn Sie auf die Schaltfläche „Zurück“ klicken.

Aktualisieren: Nachdem ich diese Antwort geschrieben hatte, wurde mir klar, dass sich unser Webserver als HTTP 1.0-Server identifiziert.Die von mir aufgelisteten Header sind die richtigen, damit Antworten von einem HTTP 1.0-Server nicht von Browsern zwischengespeichert werden.Informationen zu einem HTTP 1.1-Server finden Sie bei BalusC Antwort.

Nach ein wenig Recherche haben wir die folgende Liste von Headern erstellt, die anscheinend die meisten Browser abdecken:

In ASP.NET haben wir diese mithilfe des folgenden Snippets hinzugefügt:

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

Gefunden von: http://forums.asp.net/t/1013531.aspx

Die Verwendung des Pragma-Headers in der Antwort ist eine Frauengeschichte.RFC2616 definiert es nur als Anforderungsheader

http://www.mnot.net/cache_docs/#PRAGMA

HAFTUNGSAUSSCHLUSS:Ich empfehle dringend, die Antwort von @BalusC zu lesen.Nachdem Sie das folgende Caching-Tutorial gelesen haben: http://www.mnot.net/cache_docs/ (Ich empfehle Ihnen, es auch zu lesen), ich glaube, dass es richtig ist.Aus historischen Gründen (und weil ich es selbst getestet habe) werde ich meine ursprüngliche Antwort jedoch unten einfügen:


Ich habe die „akzeptierte“ Antwort für PHP ausprobiert, die bei mir nicht funktioniert hat.Dann habe ich ein wenig recherchiert, eine leichte Variante gefunden, getestet und es hat funktioniert.Hier ist es:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

Das sollte funktionieren.Das Problem bestand darin, dass beim zweimaligen Setzen desselben Teils des Headers, wenn der false nicht als zweites Argument an die Header-Funktion gesendet wird, überschreibt die Header-Funktion einfach das vorherige header() Anruf.Also, beim Einstellen der Cache-Control, beispielsweise wenn man nicht alle Argumente in einem zusammenfassen möchte header() Funktionsaufruf, er muss so etwas tun:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

Weitere vollständige Dokumentation anzeigen Hier.

Es gibt einen Fehler im IE6

Inhalte mit „Content-Encoding:gzip“ wird immer zwischengespeichert, auch wenn Sie „Cache-Control:kein Cache".

http://support.microsoft.com/kb/321722

Sie können die gzip-Komprimierung für IE6-Benutzer deaktivieren (überprüfen Sie den Benutzeragenten auf „MSIE 6“).

Erstellen Sie für ASP.NET Core eine einfache Middleware-Klasse:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

Dann registrieren Sie es bei Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Stellen Sie sicher, dass Sie dies irgendwo später hinzufügen

app.UseStaticFiles();

Der RFC für HTTP 1.1 sagt, dass die richtige Methode darin besteht, einen HTTP-Header hinzuzufügen für:

Cache-Kontrolle:Kein Cache

Ältere Browser ignorieren dies möglicherweise, wenn sie nicht ordnungsgemäß mit HTTP 1.1 kompatibel sind.Für diese können Sie die Überschrift ausprobieren:

Pragma:Kein Cache

Dies soll auch für HTTP 1.1-Browser funktionieren.

Diese Richtlinien mindern kein Sicherheitsrisiko.Sie zielen eigentlich darauf ab, UAs dazu zu zwingen, flüchtige Informationen zu aktualisieren, und nicht, UAs davon abzuhalten, Informationen aufzubewahren.Sehen diese ähnliche Frage.Zumindest gibt es keine Garantie dafür, dass Router, Proxys usw.wird auch die Caching-Anweisungen nicht ignorieren.

Positiv zu vermerken ist, dass Sie durch Richtlinien bezüglich des physischen Zugangs zu Computern, der Softwareinstallation usw. in puncto Sicherheit den meisten Unternehmen meilenweit voraus sind.Wenn es sich bei den Konsumenten dieser Informationen um Mitglieder der Öffentlichkeit handelt, können Sie ihnen nur dabei helfen, zu verstehen, dass, sobald die Informationen auf ihrer Maschine ankommen, diese Maschine es auch ist ihre Verantwortung, nicht deine.

Normalerweise reicht es aus, den geänderten http-Header auf ein Datum im Jahr 1995 zu setzen.

Hier ist ein Beispiel:

Expires: Wed, 15 Nov 1995 04:58:08 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, must-revalidate

Der PHP-Dokumentation für die Header-Funktion hat ein ziemlich vollständiges Beispiel (von einem Dritten beigesteuert):

    header('Pragma: public');
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");                  // Date in the past   
    header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');     // HTTP/1.1
    header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);    // HTTP/1.1
    header ("Pragma: no-cache");
    header("Expires: 0", false);

Wenn beim Herunterladen von IE6-IE8 über SSL und Cache:no-cache-Header (und ähnlichen Werten) mit MS Office-Dateien Probleme beim Herunterladen auftreten, können Sie bei POST-Anfrage den Cache:private,no-store-Header und die Rückgabedatei verwenden.Es klappt.

In meinem Fall behebe ich das Problem in Chrome damit

<form id="form1" runat="server" autocomplete="off">

wo ich aus Sicherheitsgründen den Inhalt vorheriger Formulardaten löschen muss, wenn die Benutzer auf die Schaltfläche „Zurück“ klicken

Ich habe die besten und konsistentesten Ergebnisse in allen Browsern erzielt, indem ich Pragma:Kein Cache

Die Header in der von BalusC bereitgestellten Antwort verhindern nicht, dass Safari 5 (und möglicherweise auch ältere Versionen) Inhalte aus dem Browser-Cache anzeigt, wenn die Zurück-Schaltfläche des Browsers verwendet wird.Eine Möglichkeit, dies zu verhindern, besteht darin, dem Body-Tag ein leeres Onunload-Event-Handler-Attribut hinzuzufügen:

<body onunload=""> 

Dieser Hack durchbricht offenbar den Back-Forward-Cache in Safari: Kommt es beim Klicken auf die Schaltfläche „Zurück“ zu einem browserübergreifenden Onload-Ereignis?

Die akzeptierte Antwort scheint für IIS7+ nicht zu funktionieren, wenn man die große Anzahl von Fragen zu Cache-Headern betrachtet, die in II7 nicht gesendet werden:

Und so weiter

Die akzeptierte Antwort ist richtig, welche Header gesetzt werden müssen, nicht jedoch, wie sie gesetzt werden müssen.So funktioniert es mit IIS7:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

Die erste Zeile wird festgelegt Cache-control Zu no-cache, und die zweite Zeile fügt die anderen Attribute hinzu no-store, must-revalidate

Stellen Sie außerdem sicherheitshalber sicher, dass Sie das Gerät zurücksetzen ExpiresDefault in deinem .htaccess Datei, wenn Sie diese verwenden, um das Caching zu aktivieren.

ExpiresDefault "access plus 0 seconds"

Anschließend können Sie es verwenden ExpiresByType So legen Sie bestimmte Werte für die Dateien fest, die Sie zwischenspeichern möchten:

ExpiresByType image/x-icon "access plus 3 month"

Dies kann auch nützlich sein, wenn Ihre dynamischen Dateien, z.PHP usw.werden vom Browser zwischengespeichert und Sie können nicht herausfinden, warum.Überprüfen ExpiresDefault.

Erwägen Sie zusätzlich zu den Headern die Bereitstellung Ihrer Seite über https.Viele Browser speichern https standardmäßig nicht im Cache.

//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>

Fertigstellen BalusC -> ANTWORTWenn Sie Perl verwenden, können Sie CGI verwenden, um HTTP-Header hinzuzufügen.

Mit Perl:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

Verwenden von Apache httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

Notiz: Als ich versuchte, die HTML-META zu verwenden, ignorierten die Browser sie und speicherten die Seite zwischen.

Ich möchte nur darauf hinweisen, dass das Hinzufügen dieser zusätzlichen Header programmgesteuert erfolgen sollte, wenn jemand verhindern möchte, dass NUR dynamische Inhalte zwischengespeichert werden.

Ich habe die Konfigurationsdatei meines Projekts so bearbeitet, dass No-Cache-Header angehängt werden, aber dadurch wurde auch das Caching statischer Inhalte deaktiviert, was normalerweise nicht wünschenswert ist.Durch Ändern der Antwortheader im Code wird sichergestellt, dass Bilder und Stildateien zwischengespeichert werden.

Das liegt auf der Hand, ist aber dennoch erwähnenswert.

Und noch eine Warnung.Seien Sie vorsichtig bei der Verwendung der ClearHeaders-Methode aus der HttpResponse-Klasse.Bei unvorsichtiger Anwendung kann es zu blauen Flecken kommen.Wie es mir gegeben hat.

Nach der Umleitung auf das ActionFilterAttribute-Ereignis führt das Löschen aller Header zum Verlust aller Sitzungsdaten und Daten im TempData-Speicher.Es ist sicherer, von einer Aktion umzuleiten oder Header nicht zu löschen, wenn eine Umleitung stattfindet.

Beim zweiten Nachdenken rate ich allen davon ab, die ClearHeaders-Methode zu verwenden.Es ist besser, Header separat zu entfernen.Und um den Cache-Control-Header richtig festzulegen, verwende ich diesen Code:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");

Ich hatte kein Glück damit <head><meta> Elemente.Das direkte Hinzufügen von HTTP-Cache-bezogenen Parametern (außerhalb des HTML-Dokuments) funktioniert bei mir tatsächlich.

Beispielcode in Python mit web.py web.header Anrufe folgen.Ich habe meinen persönlichen, irrelevanten Utility-Code absichtlich redigiert.

    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

    main = web.application(urls, globals())

    render = web.template.render("templates/", base="layout", cache=False)

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.main_form()

        def POST(self):
            msg = "POSTed:"
            form = web.input(function = None)
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()

Sehen Sie sich diesen Link zu einer Fallstudie zum Thema Caching an:

http://securityevaluators.com/knowledge/case_studies/caching/

Nur Zusammenfassung, laut Artikel Cache-Control: no-store Funktioniert auf Chrome, Firefox und IE.IE akzeptiert andere Steuerelemente, Chrome und Firefox jedoch nicht.Der Link ist eine gute Lektüre, einschließlich der Geschichte des Cachings und der Dokumentation des Proof of Concept.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top