Frage Wie kontrolliert man das Zwischenspeichern von Webseiten in allen Browsern?


Unsere Untersuchungen haben uns gezeigt, dass nicht alle Browser die http-Cache-Anweisungen einheitlich einhalten.

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

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

Unsere Anforderung kam von einem Sicherheitstest. Nachdem Sie sich von unserer Website ausgeloggt haben, können Sie die Zurück-Taste drücken und zwischengespeicherte Seiten anzeigen.


1223
2017-09-08 12:08


Ursprung


Antworten:


Einführung

Der richtige Mindestsatz von Headern, der für alle genannten Clients (und Proxies) gilt:

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 Clients neben benötigt Expires). Das Pragma entspricht der HTTP 1.0-Spezifikation für prähistorische Clients. Das Expires entspricht den Spezifikationen für HTTP 1.0 und 1.1 für Clients und Proxys. In HTTP 1.1 ist die Cache-Control hat Vorrang vor Expires, also ist es nur für HTTP 1.0 Proxies.

Wenn Sie IE6 und sein gebrochenes Zwischenspeichern beim Versorgen von Seiten über HTTPS mit nur nicht interessieren no-store, dann könntest du weglassen Cache-Control: no-cache.

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

Wenn Sie IE6- oder HTTP 1.0-Clients nicht interessieren (HTTP 1.1 wurde 1997 eingeführt), dann könnten Sie weglassen Pragma.

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

Wenn Sie sich auch nicht für HTTP 1.0-Proxies interessieren, können Sie das weglassen Expires.

Cache-Control: no-store, must-revalidate

Auf der anderen Seite, wenn der Server automatisch eine gültige enthält Date Kopfzeile, 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

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

Andere Cache-Control Parameter wie max-age sind irrelevant, wenn die oben genannten Cache-Control Parameter sind angegeben. Das Last-Modified Header wie in den meisten anderen Antworten hier enthalten ist nur interessant, wenn Sie eigentlich wollen um die Anfrage zwischenzuspeichern, müssen Sie sie nicht angeben.

Wie man es einstellt?

Mit 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 Sie 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:

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:

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.

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')
    )
)

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

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>

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-Metatags und HTTP-Antwortheader

Wichtig zu wissen ist, dass wenn eine HTML-Seite über eine HTTP-Verbindung bedient wird und ein Header in vorhanden ist beide die HTTP-Antwortheader und das HTML <meta http-equiv> Tags, dann wird derjenige, der im HTTP-Response-Header angegeben ist, Vorrang vor dem HTML-Meta-Tag erhalten. Das HTML-Meta-Tag wird nur verwendet, wenn die Seite vom lokalen Dateisystem aus über eine file:// URL Siehe auch W3 HTML-Spezifikation Kapitel 5.2.2. Seien Sie vorsichtig damit, wenn Sie sie nicht programmgesteuert angeben, da der Webserver nämlich einige Standardwerte enthalten kann.

Im Allgemeinen solltest du es besser machen nicht Geben Sie die HTML-Metatags an, um eine Verwechslung durch Starter zu vermeiden, und verlassen Sie sich auf harte HTTP-Antwortheader. Darüber hinaus, insbesondere diejenigen <meta http-equiv> Tags sind ungültig in HTML5. Nur der http-equiv Werte aufgelistet 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 Webbrowser-Entwickler-Toolsets sehen / debuggen. Sie können dorthin gelangen, indem Sie F12 in Chrome / Firefox23 + / IE9 + drücken, dann die Registerkarte "Netzwerk" oder "Net" öffnen und dann auf die gewünschte HTTP-Anfrage klicken, um alle Details zur HTTP-Anfrage und -Antwort anzuzeigen. Das unter dem Screenshot kommt von Chrome:

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

Ich möchte diese Header auch auf Dateidownloads setzen

Diese Frage und Antwort richtet sich zunächst auf "Webseiten" (HTML-Seiten), nicht auf "Datei-Downloads" (PDF, Zip, Excel, etc.). Sie sollten sie lieber zwischenspeichern und eine Dateiversions-ID irgendwo im URI-Pfad oder Querystring verwenden, um ein Redownload für eine geänderte Datei zu erzwingen. Wenn Sie diese No-Cache-Header trotzdem auf Dateidownloads anwenden, sollten Sie den IE7 / 8-Fehler beachten, wenn Sie einen Dateidownload über HTTPS statt HTTP bereitstellen. Für Details, siehe 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.


2121
2018-03-30 23:08



(hey, alle: bitte kopiere nicht einfach alle Header die du finden kannst)

Als erstes, Back-Taste Geschichte ist kein Cache:

Das Frischemodell (Abschnitt 4.2) trifft nicht notwendigerweise auf historische Mechanismen zu. Das heißt, ein Historienmechanismus kann eine vorherige Repräsentation anzeigen, selbst wenn sie abgelaufen ist.

In der alten HTTP-Spezifikation war der Wortlaut sogar noch stärker und wies die Browser explizit an, die Cache-Anweisungen für den Back-Button-Verlauf zu ignorieren.

Zurück soll in der Zeit zurückgehen (zu der Zeit, als der Benutzer war eingeloggt). Es navigiert nicht zu einer zuvor geöffneten URL.

In der Praxis kann der Cache jedoch den Back-Button unter bestimmten Umständen beeinflussen:

  • Seite Muss überliefert werden HTTPSsonst wird dieses Cache-Busting nicht zuverlässig sein. Außerdem, wenn Sie nicht HTTPS verwenden, ist Ihre Seite anfällig für Login-Diebstahl auf viele andere Arten.
  • Sie müssen senden Cache-Control: no-store, must-revalidate (Einige Browser beobachten no-store und einige beobachten must-revalidate)

Sie noch nie brauche eines von:

  • <meta> mit Cache-Headern - es funktioniert überhaupt nicht. Total nutzlos.
  • post-check/pre-check - Es ist nur IE-Direktive, die nur gilt für abspeicherbar Ressourcen.
  • Senden Sie den gleichen Header zweimal oder in dutzend Teilen. Einige PHP-Snippets da draußen ersetzen vorherige Header, was dazu führt, dass nur der letzte gesendet wird.

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

  • no-cache oder max-age=0, wodurch die Ressource (URL) "veraltet" wird und Browser aufgefordert werden, mit dem Server zu überprüfen, ob es eine neuere Version gibt (no-storeimpliziert dies sogar noch stärker).
  • Expires mit einem Datum in der Vergangenheit für HTTP / 1.0-Clients (obwohl echt HTTP / 1.0-only-Clients sind in diesen Tagen völlig inexistent.

Bonus: Der neue HTTP-Caching-RFC.


205
2017-08-29 16:50



Wie bereits erwähnt, möchten Sie den Cache nicht 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 das nur durch Cache-Control: no-store.

In FireFox (v23.0.1) funktioniert jeder von diesen:

  1. Cache-Control: no-store

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

  3. Pragma: no-cache (nur https)

  4. Vary: * (nur https)

In Opera (v.12.15) können wir das nur durch Cache-Control: must-revalidate (nur https)

In Safari (v5.1.7, 7534.57.2) funktioniert jeder von diesen:

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

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

In IE8 (v8.0.6001.18702IC) funktioniert jeder von diesen:

  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 Funktionen erhalten Sie diese Lösung für Chrome 28, FireFox 23, IE8, Safari 5.1.7 und Opera 12.15:  Cache-Control: no-store, must-revalidate (nur https)

Beachten Sie, dass https benötigt wird, da Opera den Protokollpuffer für einfache HTTP-Seiten nicht deaktiviert. Wenn du wirklich kein https bekommst und bereit bist, Opera zu ignorieren, ist das das Beste, was du tun kannst:

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

Unten sehen Sie die rohen Protokolle 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="">
    Nicht bestanden: Opera 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="">
    Nicht bestanden: 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: *
    Fehler: 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: *
    Fehler: 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="">
    Fehler: 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="">
    Fehler: 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="">
    Fehler: 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="">
    Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

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

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

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

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

  13. Pragma: no-cache
    Fehler: 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="">
    Fehler: 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="">
    Fehler: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Erfolg: IE8

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

  17. Cache-Control: must-revalidate
    Expires: 0
    Fehler: 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
    Fehler: 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="">
    Fehler: 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="">
    Fehler: 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="">
    Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Erfolg: keiner

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

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

  5. Cache-Control: no-cache
    Fehler: 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
    Fehler: 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: *
    Fehler: 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: *
    Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolg: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Fehler: 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="">
    Fehler: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Erfolg: Oper 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Fehler: 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="">
    Fehler: 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="">
    Fehler: Chrome 28, Safari 5.1.7
    Erfolg: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Nicht bestanden: Opera 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="">
    Nicht bestanden: 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="">
    Nicht bestanden: Opera 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: *
    Fehler: Chrome 28, Safari 5.1.7, Opera 12.15
    Erfolg: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Fehler: 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
    Fehler: 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="">
    Fehler: 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="">
    Fehler: 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: *
    Fehler: Chrome 28, Safari 5.1.7
    Erfolg: FireFox 23, IE8, Opera 12.15

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


82
2018-06-15 02:40



Ich fand die web.config-Route nützlich (versuchte, sie zur Antwort hinzuzufügen, scheint aber nicht akzeptiert worden zu sein, um hier zu posten)

<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 Weg von express / node.js:

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

24
2018-01-14 23:35



Ich fand, dass alle Antworten auf dieser Seite immer noch Probleme hatten. Insbesondere fiel mir auf, dass keiner von ihnen IE8 daran hindern würde, eine zwischengespeicherte Version der Seite zu verwenden, wenn Sie darauf durch Drücken der Zurück-Taste zugegriffen hatten.

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

Cache-Control: Nicht speichern
  Variieren: *

Für eine Erklärung des Vary-Headers, check out 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 bewirkten diese Header, dass die Seite vom Server angefordert wurde, wenn Sie auf einen Link zu der Seite klicken oder die URL eingeben direkt in der Adressleiste. Das deckt ungefähr ab 99% aller Browser, die seit Januar 2010 verwendet werden.

Bei IE6 und Opera 9-10 führte das Drücken der Zurück-Taste immer noch dazu, dass die zwischengespeicherte Version geladen wurde. In allen anderen Browsern, die ich getestet habe, haben sie eine neue Version vom Server heruntergeladen. Bisher habe ich keine Header gefunden, die dazu führen, dass diese Browser keine zwischengespeicherten Versionen von Seiten zurückgeben, wenn Sie die Zurück-Taste drücken.

Aktualisieren:  Nachdem ich diese Antwort geschrieben hatte, erkannte ich, dass unser Webserver sich selbst 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. Sehen Sie sich für einen HTTP 1.1-Server BalusC an Antworten.


22
2017-09-08 12:11



Nach ein wenig Nachforschung kamen wir auf die folgende Liste von Kopfzeilen, die die meisten Browser zu umfassen schienen:

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


18
2017-09-17 14:18



Die Verwendung des Pragma-Headers in der Antwort ist ein Frauenmärchen. RFC2616 definiert es nur als Anforderungsheader

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


8
2017-09-18 10:36



DISCLAIMER: Ich empfehle dringend @ balusC's Antwort zu lesen. Nach dem Lesen des folgenden Caching-Tutorials: 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 unten einfügen:


Ich habe die "akzeptierte" Antwort für PHP ausprobiert, was bei mir nicht funktioniert hat. Dann habe ich ein bisschen geforscht, 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 war, dass wenn der selbe Teil des Headers zweimal gesetzt wurde false wird nicht als zweites Argument an die Header-Funktion gesendet, Header-Funktion überschreibt einfach die vorherige header() Anruf. Also, beim Einstellen der Cache-Controlzum Beispiel, 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);

Siehe vollständigere Dokumentation Hier.


7
2018-06-13 15:23



Es gibt einen Fehler in IE6

Inhalt mit "Content-Encoding: gzip" wird 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 Benutzer-Agent für "MSIE 6")


7
2017-09-08 12:14