Unsere Untersuchungen haben gezeigt, dass nicht alle Browser die HTTP-Cache-Anweisungen einheitlich einhalten.
Aus Sicherheitsgründen möchten wir nicht, dass bestimmte Seiten in unserer Anwendung jemals vom Webbrowser zwischengespeichert werden. Dies muss für mindestens die folgenden Browser funktionieren:
- Internet Explorer 6+
- Firefox 1.5+
- Safari 3+
- Opera 9+
- Chrom
Unsere Anforderung ergab sich aus einem Sicherheitstest. Nachdem Sie sich von unserer Website abgemeldet haben, können Sie die Zurück-Taste drücken und zwischengespeicherte Seiten anzeigen.
http
caching
https
http-headers
Edward Wilde
quelle
quelle
Antworten:
Einführung
Der richtige Mindestsatz an Headern, der für alle genannten Clients (und Proxys) funktioniert:
Das
Cache-Control
ist für die HTTP 1.1 - Spezifikation für Clients und Proxies (und implizit von einigen Kunden neben erforderlichExpires
). DasPragma
ist für die HTTP 1.0 - Spezifikation für prähistorische Kunden. DasExpires
ist per HTTP 1.0 und 1.1 Spezifikationen für Clients und Proxies. In HTTP 1.1 hat dasCache-Control
Vorrang vorExpires
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 weglassenCache-Control: no-cache
.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
.Wenn Sie sich auch nicht für HTTP 1.0-Proxys interessieren, können Sie dies weglassen
Expires
.Wenn der Server hingegen automatisch einen gültigen
Date
Header enthält, können Sie ihn theoretisch auch weglassenCache-Control
und sichExpires
nur darauf verlassen.Dies kann jedoch fehlschlagen, wenn z. B. der Endbenutzer das Datum des Betriebssystems manipuliert und die Client-Software darauf vertraut.
Andere
Cache-Control
Parameter wiemax-age
sind irrelevant, wenn die oben genanntenCache-Control
Parameter angegeben werden. DerLast-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:
Verwenden von Java Servlet oder Node.js:
Verwenden von ASP.NET-MVC
Verwenden der ASP.NET-Web-API:
Verwenden von ASP.NET:
Verwenden von ASP.NET Core v3
Verwenden von ASP:
Verwenden von Ruby on Rails oder Python / Flask:
Verwenden von Python / Django:
Verwenden von Python / Pyramid:
Verwenden von Go:
Verwenden der Apache-
.htaccess
Datei:Verwenden von HTML4:
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 einefile://
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 diehttp-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 .
quelle
(Hey, alle zusammen: Bitte kopieren Sie nicht einfach alle Header, die Sie finden können, und fügen Sie sie ein.)
Erstens ist der Verlauf der Zurück-Schaltfläche kein Cache :
In der alten HTTP-Spezifikation war der Wortlaut noch stärker und forderte die Browser ausdrücklich auf, Cache-Anweisungen für den Verlauf der Zurück-Schaltflächen zu ignorieren.
Zurück sollte in der Zeit zurückgehen (zu der Zeit , wenn der Benutzer wurde angemeldet). Es wird nicht vorwärts zu einer zuvor geöffneten URL navigiert.
In der Praxis kann der Cache jedoch unter ganz bestimmten Umständen die Zurück-Schaltfläche beeinflussen:
Cache-Control: no-store, must-revalidate
(einige Browser beobachtenno-store
und einige beobachtenmust-revalidate
)Sie brauchen nie eines von:
<meta>
mit Cache-Headern - es funktioniert überhaupt nicht. Völlig nutzlos.post-check
/pre-check
- Es ist eine Nur-IE-Direktive, die nur für zwischenspeicherbare Ressourcen gilt.Wenn Sie möchten, können Sie hinzufügen:
no-cache
odermax-age=0
, wodurch die Ressource (URL) "veraltet" wird und 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 echte HTTP / 1.0-Clients heutzutage überhaupt nicht existieren).Bonus: Der neue HTTP-Caching-RFC .
quelle
Cache-Control: must-revalidate
. Warum nicht senden,Cache-Control: no-cache
da diesno-cache
bereits impliziertmust-revalidate
? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1no-cache
mitmust-revalidate
gilt für den Cache, aber der Hintergrundverlauf ist kein Cache. Browser-Sonderfall explizitmust-revalidate
zur Steuerung des Verlaufsverhaltens .Wie @Kornel sagte, möchten 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 mit tun
Cache-Control: no-store
.In FireFox (v23.0.1) funktioniert Folgendes:
Cache-Control: no-store
Cache-Control: no-cache
(nur https)Pragma: no-cache
(nur https)Vary: *
(nur https)In Opera (v12.15) können wir dies nur über
Cache-Control: must-revalidate
(nur https) tun .In Safari (v5.1.7, 7534.57.2) funktioniert Folgendes:
Cache-Control: no-store
<body onunload="">
in htmlCache-Control: no-store
(nur https)In IE8 (v8.0.6001.18702IC) funktioniert eine dieser Funktionen:
Cache-Control: must-revalidate, max-age=0
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
Expires: 0
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
(nur https)Vary: *
(nur https)Wenn wir das oben Genannte kombinieren, 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 https wirklich nicht erhalten können und bereit sind, Opera zu ignorieren, können Sie Folgendes tun:
Unten sehen Sie die Rohprotokolle meiner Tests:
HTTP:
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="">
Fehler: Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7
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="">
Fehler: Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Fehler: Safari 5.1.7, Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8
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: *
Fehler: Safari 5.1.7, Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
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="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
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="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: no-store
Fehler: Safari 5.1.7, Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8
Cache-Control: no-store
<body onunload="">
Fehler: Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: no-cache
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Vary: *
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Erfolg: keine
Pragma: no-cache
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Erfolg: keine
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="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: must-revalidate, max-age=0
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: must-revalidate
Expires: 0
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Erfolg: IE8
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
Pragma: no-cache
Vary: *
<body onunload="">
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Erfolg: keine
HTTPS:
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Erfolg: keine
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Erfolg: keine
Vary: *
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
Pragma: no-cache
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
Cache-Control: no-cache
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
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: *
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
Cache-Control: must-revalidate
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Erfolg: Opera 12.15
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Erfolg: Opera 12.15
Cache-Control: must-revalidate, max-age=0
Fehler: Chrome 28, FireFox 23, Safari 5.1.7
Erfolg: IE8, Opera 12.15
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="">
Fehler: Chrome 28, Safari 5.1.7
Erfolg: FireFox 23, IE8, Opera 12.15
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fehler: Chrome 28, Safari 5.1.7
Erfolg: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store
Fehler: Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fehler: Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7
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="">
Fehler: Opera 12.15
Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: private, no-cache
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
Erfolg: FireFox 23, IE8
Cache-Control: must-revalidate
Expires: 0
Fehler: Chrome 28, FireFox 23, Safari 5.1.7,
Erfolg: IE8, Opera 12.15
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Fehler: Chrome 28, FireFox 23, Safari 5.1.7,
Erfolg: IE8, Opera 12.15
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7,
Erfolg: IE8, Opera 12.15
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Fehler: Chrome 28, FireFox 23, Safari 5.1.7,
Erfolg: IE8, Opera 12.15
Cache-Control: private, must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fehler: Chrome 28, Safari 5.1.7
Erfolg: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store, must-revalidate
Fehler : keine Erfolg: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
quelle
<body onunload="">
aber es scheint eher ein Weg zu sein, um das eigentliche Problem zu umgehen. Ich habe versucht, .htaccess zu verwenden und die Header auf diese Weise zu ändern. Wenn ich HTTPS verwende, sollte es dann so funktionieren? Es ist hauptsächlich eine Safari, bei der das Problem am meisten auftritt.Cache-Control: no-store
würde das Hinzufügen den Trick tun, wenn Sie HTTPS haben .<body onunload="">
wird nur benötigt, wenn Sie kein HTTPS haben.Ich fand die Route web.config nützlich (habe versucht, sie der Antwort hinzuzufügen, scheint aber nicht akzeptiert worden zu sein, also poste ich hier)
Und hier ist die Methode von express / node.j, um dasselbe zu tun:
quelle
web.conf
ist: Es ist die Haupteinstellungen und Konfigurationsdatei für eineASP.NET
Webanwendung. Es ist ein XML-Dokument, das sich im Stammverzeichnis befindet. ( Wiki ).Ich stellte fest, dass alle Antworten auf dieser Seite immer noch Probleme hatten. Insbesondere ist mir aufgefallen, dass keiner von ihnen IE8 daran hindern würde, eine zwischengespeicherte Version der Seite zu verwenden, wenn Sie darauf zugreifen, indem Sie auf die Schaltfläche "Zurück" klicken.
Nach vielen Recherchen und Tests stellte ich fest, dass die einzigen zwei Header, die ich wirklich brauchte, waren:
Eine Erläuterung des Vary-Headers finden Sie unter http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6
Unter IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 und Opera 9-10 haben diese Header dazu geführt, dass die Seite vom Server angefordert wurde, wenn Sie auf einen Link zur Seite klicken oder die URL eingeben direkt in der Adressleiste. Das deckt ungefähr 99% aller Browser ab, die ab dem 10. Januar verwendet werden.
Unter IE6 und Opera 9-10 führte das Drücken der Zurück-Taste weiterhin zum Laden der zwischengespeicherten Version. In allen anderen von mir getesteten Browsern wurde eine neue Version vom Server abgerufen. Bisher habe ich keine Header gefunden, die dazu führen, dass diese Browser keine zwischengespeicherten Versionen von Seiten zurückgeben, wenn Sie auf die Schaltfläche "Zurück" klicken.
Update: Nachdem ich diese Antwort geschrieben hatte, stellte ich fest, 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. Schauen Sie sich für einen HTTP 1.1-Server die Antwort von BalusC an .
quelle
Nach ein wenig Recherche haben wir die folgende Liste von Headern erstellt, die die meisten Browser abzudecken schienen:
In ASP.NET haben wir diese mithilfe des folgenden Snippets hinzugefügt:
Gefunden von: http://forums.asp.net/t/1013531.aspx
quelle
Cache-Control: no-cache
undCache-Control: private
Zusammenstoß - Sie sollten niemals beides zusammenbringen: Ersteres weist Browser und Proxys an, überhaupt nicht zwischenzuspeichern, letzteres weist Proxys an, nicht zwischenzuspeichern, sondern lässt Browser ihre eigene private Kopie halten. Ich bin nicht sicher, welcher Einstellung der Browser folgen wird, aber es ist unwahrscheinlich, dass sie zwischen Browsern und Versionen konsistent ist.Die Verwendung des Pragma-Headers in der Antwort ist eine Frauengeschichte. RFC2616 definiert es nur als Anforderungsheader
http://www.mnot.net/cache_docs/#PRAGMA
quelle
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), glaube ich, dass es korrekt ist. Aus historischen Gründen (und weil ich es selbst getestet habe) werde ich meine ursprüngliche Antwort unten einfügen:
Ich habe die 'akzeptierte' Antwort für PHP ausprobiert, was bei mir nicht funktioniert hat. Dann habe ich ein wenig recherchiert, eine leichte Variante gefunden, sie getestet und es hat funktioniert. Hier ist es:
Das sollte funktionieren. Das Problem bestand darin, dass beim zweimaligen Setzen desselben Teils des Headers
false
die Header-Funktion den vorherigenheader()
Aufruf einfach überschreibt , wenn der nicht als zweites Argument an die Header-Funktion gesendet wird . Also, wenn die EinstellungCache-Control
, zum Beispiel , wenn man nicht alle Argumente in einer setzen möchteheader()
Funktionsaufruf, muss er so etwas tun:Eine ausführlichere Dokumentation finden Sie hier .
quelle
Erstellen Sie für ASP.NET Core eine einfache Middleware-Klasse:
dann registrieren Sie es mit
Startup.cs
Stellen Sie sicher, dass Sie dies irgendwo später hinzufügen
quelle
Diese Richtlinien mindern kein Sicherheitsrisiko. Sie sollen UAs dazu zwingen, flüchtige Informationen zu aktualisieren, und UAs nicht davon abhalten, Informationen zu speichern. Siehe diese ähnliche Frage . Zumindest gibt es keine Garantie dafür, dass Router, Proxys usw. die Caching-Anweisungen ebenfalls nicht ignorieren.
Positiv zu vermerken ist, dass Sie mit Richtlinien zum physischen Zugriff auf Computer, zur Softwareinstallation und dergleichen den meisten Unternehmen in Bezug auf die Sicherheit weit voraus sind. Wenn die Verbraucher dieser Informationen Mitglieder der Öffentlichkeit sind, können Sie ihnen nur helfen, zu verstehen, dass diese Maschine, sobald die Informationen auf ihren Computer gelangen, in ihrer Verantwortung liegt und nicht in Ihrer.
quelle
Es gibt einen Fehler in IE6
Inhalte mit "Content-Encoding: gzip" werden immer zwischengespeichert, auch wenn Sie "Cache-Control: no-cache" verwenden.
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").
quelle
Der RFC für HTTP 1.1 besagt, 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 diejenigen können Sie den Header versuchen:
Pragma: kein Cache
Dies soll auch für HTTP 1.1-Browser funktionieren.
quelle
Das Setzen des geänderten http-Headers auf ein Datum im Jahr 1995 reicht normalerweise aus.
Hier ist ein Beispiel:
quelle
Die PHP-Dokumentation für die Header-Funktion enthält ein ziemlich vollständiges Beispiel (von einem Dritten beigesteuert):
quelle
Wenn Sie Downloadprobleme mit IE6-IE8 über SSL und Cache: No-Cache-Header (und ähnliche Werte) mit MS Office-Dateien haben, können Sie Cache: Private, No-Store-Header und Rückgabedatei auf POST-Anforderung verwenden. Es klappt.
quelle
in meinem Fall behebe ich das Problem in Chrom damit
wo ich den Inhalt eines vorherigen Formulars löschen muss, wenn die Benutzer aus Sicherheitsgründen auf die Schaltfläche zurück klicken
quelle
Die akzeptierte Antwort scheint für IIS7 + nicht zu funktionieren, da viele Fragen zu Cache-Headern in II7 nicht gesendet wurden:
Und so weiter
Die akzeptierte Antwort ist korrekt, in welchen Headern gesetzt werden muss, nicht jedoch, wie sie gesetzt werden müssen. Diese Methode funktioniert mit IIS7:
Die erste Zeile wird
Cache-control
auf gesetztno-cache
und die zweite Zeile fügt die anderen Attribute hinzuno-store, must-revalidate
quelle
Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Ich habe in allen Browsern die besten und beständigsten Ergebnisse erzielt, indem ich Pragma: no-cache eingestellt habe
quelle
Die Überschriften in der Antwort von BalusC hindern Safari 5 (und möglicherweise auch ältere Versionen) nicht daran, Inhalte aus dem Browser-Cache anzuzeigen, wenn Sie die Zurück-Schaltfläche des Browsers verwenden. Eine Möglichkeit, dies zu verhindern, besteht darin, dem body-Tag ein leeres onunload-Ereignishandlerattribut hinzuzufügen:
Dieser Hack bricht anscheinend den Back-Forward-Cache in Safari: Gibt es ein browserübergreifendes Onload-Ereignis, wenn Sie auf die Schaltfläche "Zurück" klicken?
quelle
Stellen Sie außerdem sicher, dass Sie das
ExpiresDefault
in Ihrer.htaccess
Datei zurücksetzen, wenn Sie dies verwenden, um das Caching zu aktivieren.Anschließend können Sie
ExpiresByType
bestimmte Werte für die Dateien festlegen, die Sie zwischenspeichern möchten:Dies kann auch nützlich sein, wenn Ihre dynamischen Dateien, z. B. PHP usw., vom Browser zwischengespeichert werden und Sie nicht herausfinden können, warum. Überprüfen Sie
ExpiresDefault
.quelle
Zusätzlich zu den Headern sollten Sie Ihre Seite über https bereitstellen . Viele Browser speichern https standardmäßig nicht zwischen.
quelle
quelle
So vervollständigen Sie BalusC -> ANTWORT Wenn Sie Perl verwenden, können Sie mit CGI HTTP-Header hinzufügen.
Verwenden von Perl:
Verwenden von Apache httpd.conf
Hinweis: Als ich versuchte, die HTML-META zu verwenden, haben die Browser diese ignoriert und die Seite zwischengespeichert.
quelle
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 keine Cache-Header angehängt werden. Dadurch wurde jedoch auch das Zwischenspeichern von statischem Inhalt deaktiviert, was normalerweise nicht wünschenswert ist. Durch Ändern der Antwortheader im Code wird sichergestellt, dass Bilder und Stildateien zwischengespeichert werden.
Dies ist ziemlich offensichtlich und dennoch erwähnenswert.
Und noch eine Vorsicht. Seien Sie vorsichtig mit der ClearHeaders-Methode aus der HttpResponse-Klasse. Es kann einige blaue Flecken verursachen, wenn Sie es rücksichtslos verwenden. Als ob es mir gegeben hätte.
Nach der Umleitung zum ActionFilterAttribute-Ereignis gehen beim Löschen aller Header alle Sitzungsdaten und Daten im TempData-Speicher verloren. Es ist sicherer, von einer Aktion umzuleiten oder Header nicht zu löschen, wenn eine Umleitung stattfindet.
Beim zweiten Gedanken rate ich allen davon ab, die ClearHeaders-Methode zu verwenden. Es ist besser, Header separat zu entfernen. Und um den Cache-Control-Header richtig einzustellen, verwende ich diesen Code:
quelle
Ich hatte kein Glück mit
<head><meta>
Elementen. Das direkte Hinzufügen von HTTP-Cache-bezogenen Parametern (außerhalb des HTML-Dokuments) funktioniert in der Tat für mich.Es
web.header
folgt ein Beispielcode in Python mit web.py- Aufrufen. Ich habe meinen persönlichen irrelevanten Dienstprogrammcode absichtlich redigiert.quelle
Siehe diesen Link zu einer Fallstudie zum Caching:
http://securityevaluators.com/knowledge/case_studies/caching/
Zusammenfassung
Cache-Control: no-store
funktioniert laut Artikel nur unter Chrome, Firefox und IE. IE akzeptiert andere Steuerelemente, Chrome und Firefox jedoch nicht. Der Link ist eine gute Lektüre mit der Geschichte des Zwischenspeicherns und der Dokumentation von Proof of Concept.quelle
Ich bin mir nicht sicher, ob meine Antwort einfach und dumm klingt, und vielleicht ist sie Ihnen schon vor langer Zeit bekannt, aber da es eines Ihrer Ziele ist, jemanden daran zu hindern, die Browser-Zurück-Schaltfläche zum Anzeigen Ihrer historischen Seiten zu verwenden, können Sie Folgendes verwenden:
window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");
Natürlich kann dies möglicherweise nicht auf der gesamten Site implementiert werden, aber zumindest für einige kritische Seiten können Sie dies tun. Hoffe das hilft.
quelle
Sie können den Standortblock verwenden, um einzelne Dateien festzulegen, anstatt die gesamte App in IIS zwischenzuspeichern
quelle