Antworten:
Ich hatte dieselbe Frage und fand einige Informationen in meinen Suchanfragen (Ihre Frage wurde als eines der Ergebnisse angezeigt). Folgendes habe ich festgestellt ...
Der Cache-Control
Header hat zwei Seiten . Eine Seite ist, wo es vom Webserver (auch bekannt als "Ursprungsserver") gesendet werden kann. Auf der anderen Seite kann es vom Browser gesendet werden (auch bekannt als "User Agent").
Ich glaube max-age=0
einfach sagt Caches (und User Agents) die Antwort ist abgestanden aus dem get-go und so sie sollten die Antwort revalidate (z. B. mit dem If-Not-Modified
Header) , bevor Sie eine Cache - Kopie verwenden, während no-cache
sie erzählt sie muss vor der Verwendung eines im Cache gespeicherten revalidate Kopieren. Ab 14.9.1 Was ist zwischenspeicherbar :
kein Cache
... ein Cache darf die Antwort NICHT verwenden, um eine nachfolgende Anforderung ohne erfolgreiche erneute Validierung mit dem Ursprungsserver zu erfüllen. Auf diese Weise kann ein Ursprungsserver das Caching auch durch Caches verhindern, die so konfiguriert wurden, dass veraltete Antworten auf Clientanforderungen zurückgegeben werden.
Mit anderen Worten, Caches entscheiden sich manchmal für die Verwendung einer veralteten Antwort (obwohl ich glaube, dass sie dann einen Warning
Header hinzufügen müssen ), no-cache
sagen jedoch, dass sie keine veraltete Antwort verwenden dürfen, egal was passiert. Vielleicht würden Sie wollen SOLLEN -revalidate Verhalten beim Baseball Statistik auf einer Seite erzeugt werden, aber Sie würden das wollen MUST -revalidate Verhalten , wenn Sie die Antwort auf einen E-Commerce - Kauf generiert haben.
Obwohl Sie in Ihrem Kommentar richtig liegen, wenn Sie sagen no-cache
, dass dies die Speicherung nicht verhindern soll, könnte dies tatsächlich ein weiterer Unterschied bei der Verwendung sein no-cache
. Ich bin auf eine Seite gestoßen , Cache Control Directives Demystified , auf der steht (ich kann nicht für die Richtigkeit bürgen):
In der Praxis haben IE und Firefox damit begonnen, die No-Cache-Direktive so zu behandeln, als ob sie den Browser anweist, die Seite nicht einmal zwischenzuspeichern. Wir haben vor etwa einem Jahr begonnen, dieses Verhalten zu beobachten. Wir vermuten, dass diese Änderung durch die weit verbreitete (und falsche) Verwendung dieser Richtlinie zur Verhinderung von Caching ausgelöst wurde.
...
Beachten Sie, dass sich "Cache-Steuerung: kein Cache" in letzter Zeit auch wie die Direktive "no-store" verhält.
Abgesehen davon scheint es mir, dass Cache-Control: max-age=0, must-revalidate
im Grunde das Gleiche bedeuten sollte wie Cache-Control: no-cache
. Vielleicht ist dies ein Weg, um das MUSS-neu validierte Verhalten von zu erhalten no-cache
und gleichzeitig die offensichtliche Migration no-cache
zu vermeiden , das Gleiche zu tun wie no-store
(dh überhaupt kein Caching)?
Ich glaube, Shahkalpeshs Antwort gilt für die Seite der Benutzeragenten. Sie können sich auch 13.2.6 Mehrdeutige Antworten ansehen .
Wenn ein Benutzeragent eine Anfrage mit Cache-Control: max-age=0
(auch bekannt als "End-to-End-Revalidierung") sendet, validiert jeder Cache auf dem Weg seinen Cache-Eintrag (z. B. mit dem If-Not-Modified
Header) bis zum Ursprungsserver. Wenn die Antwort dann 304 (nicht geändert) lautet, kann die zwischengespeicherte Entität verwendet werden.
Auf der anderen Seite wird das Senden einer Anfrage mit Cache-Control: no-cache
(auch bekannt als "End-to-End-Reload") nicht erneut validiert, und der Server darf beim Antworten KEINE zwischengespeicherte Kopie verwenden.
must-revalidate
soll NICHT mit no-cache
oder identisch sein no-store
. Der letztere umgeht die Caches insgesamt, der erstere sagt jedoch nur, dass ein Cache immer auf Aktualität überprüft werden muss. Wenn er jedoch noch aktuell ist, kann er verwendet werden, wodurch Bandbreite gespart wird. Letzteres erzwingt ständig vollständige End-to-End-Downloads, beansprucht unnötige Bandbreite und verzögert die Antworten.
no-cache
die Caches nicht vollständig" oder " erzwingt ständig vollständige End-to-End-Downloads", zumindest nicht in allen Browsern. Die Spezifikation besagt nur, dass der Browser den Cache validieren muss.
maximales Alter = 0
Dies entspricht dem Klicken auf Aktualisieren . Geben Sie mir also die neueste Kopie, es sei denn, ich habe bereits die neueste Kopie.
kein Cache
Dies hält die Umschalttaste gedrückt, während Sie auf Aktualisieren klicken. Dies bedeutet, dass Sie einfach alles wiederholen müssen, egal was passiert.
no-store
Alte Frage jetzt, aber wenn jemand wie ich durch eine Suche darauf stößt, scheint IE9 dies zu nutzen, um das Verhalten von Ressourcen bei Verwendung der Schaltflächen Zurück und Vorwärts zu konfigurieren. Wenn max-age = 0 verwendet wird, verwendet der Browser die letzte Version, wenn eine Ressource bei einem Vorwärts- / Rückwärtsdruck angezeigt wird. Wenn kein Cache verwendet wird, wird die Ressource erneut abgerufen.
Weitere Details zum IE9-Caching finden Sie in diesem MSDN-Caching-Blogbeitrag .
In meinen letzten Tests mit IE8 und Firefox 3.5 scheinen beide RFC-kompatibel zu sein. Sie unterscheiden sich jedoch in ihrer "Freundlichkeit" zum Ursprungsserver. IE8 behandelt no-cache
Antworten mit derselben Semantik wie max-age=0,must-revalidate
. Firefox 3.5 scheint jedoch no-cache
als gleichwertig zu gelten no-store
, was die Leistung und die Bandbreitennutzung beeinträchtigt.
Squid Cache scheint standardmäßig niemals etwas mit einem no-cache
Header zu speichern , genau wie Firefox.
Mein Rat wäre, public,max-age=0
nicht sensible Ressourcen festzulegen, die bei jeder Anforderung auf Aktualität überprüft werden sollen, aber dennoch die Leistungs- und Bandbreitenvorteile des Caching zu berücksichtigen. Verwenden Sie für Artikel pro Benutzer mit derselben Überlegung private,max-age=0
.
Ich würde die Verwendung von no-cache
völlig vermeiden , da es scheint, dass es von einigen Browsern und populären Caches zum funktionalen Äquivalent von bastardisiert wurde no-store
.
Emulieren Sie außerdem nicht Akamai und Limelight. Während sie im Wesentlichen massive Caching-Arrays als Hauptgeschäft ausführen und Experten sein sollten, haben sie tatsächlich ein begründetes Interesse daran, dass mehr Daten aus ihren Netzwerken heruntergeladen werden. Google ist möglicherweise auch keine gute Wahl für die Emulation. Sie scheinen je nach Ressource zu verwenden max-age=0
oder no-cache
zufällig.
private,max-age=0
.
maximales Alter Wenn ein Zwischencache mithilfe einer Anweisung max-age = 0 zur erneuten Validierung gezwungen wird einen eigenen Cache-Eintrag, und der Client hat in der Anfrage seinen eigenen Validator angegeben, den Der mitgelieferte Validator kann von dem aktuell mit dem Cache-Eintrag gespeicherten Validator abweichen. In diesem Fall kann der Cache einen der beiden Validatoren verwenden, um eine eigene Anfrage ohne zu stellen Auswirkungen auf die semantische Transparenz. Die Wahl des Validators kann jedoch die Leistung beeinträchtigen. Der beste Ansatz ist für die Zwischencache zur Verwendung eines eigenen Validators bei der Anforderung. Wenn der Server antwortet Mit 304 (nicht geändert) kann der Cache seine jetzt validierte Kopie an den Client zurückgeben mit einer 200 (OK) Antwort. Wenn der Server mit einer neuen Entität und einem neuen Cache-Validator antwortet, Der Zwischencache kann jedoch den zurückgegebenen Validator mit dem in bereitgestellten vergleichen die Anfrage des Kunden unter Verwendung der starken Vergleichsfunktion. Wenn der Validator des Clients ist gleich dem Ursprungsserver, dann gibt der Zwischencache einfach 304 (Not Geändert). Andernfalls wird die neue Entität mit einer Antwort von 200 (OK) zurückgegeben. Wenn eine Anforderung die No-Cache-Direktive enthält, sollte sie NICHT min-fresh enthalten. Max-Stale oder Max-Alter.
Mit freundlicher Genehmigung: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
Akzeptiere dies nicht als Antwort - ich muss es lesen, um die wahre Verwendung zu verstehen :)
Ich bin kaum ein Caching-Experte, aber Mark Nottingham ist es. Hier sind seine Caching-Dokumente . Er hat auch ausgezeichnete Links im Abschnitt Referenzen.
Basierend auf meiner Lektüre dieser Dokumente sieht es so aus, als max-age=0
könnte der Cache eine zwischengespeicherte Antwort auf Anfragen senden, die zur "gleichen Zeit" eingegangen sind, wobei "zur gleichen Zeit" bedeutet, dass sie nahe genug beieinander liegen und gleichzeitig mit dem Cache aussehen, dies aber no-cache
nicht tun würden .
Übrigens ist es erwähnenswert, dass einige mobile Geräte, insbesondere Apple-Produkte wie iPhone / iPad, Header wie "No-Cache", "No-Store", "Expires: 0" oder was auch immer Sie sonst versuchen möchten, sie zu zwingen, abgelaufen nicht wiederzuverwenden, vollständig ignorieren Formularseiten.
Dies hat uns endlose Kopfschmerzen bereitet, da wir versuchen, das Problem zu lösen, dass das iPad eines Benutzers beispielsweise auf einer Seite eingeschlafen ist, die er durch einen Formularprozess erreicht hat, z. B. Schritt 2 von 3, und das Gerät den Speicher dann vollständig ignoriert. Cache-Direktiven nehmen, soweit ich das beurteilen kann, einfach einen virtuellen Schnappschuss der Seite aus ihrem letzten Zustand, dh ignorieren das, was explizit gesagt wurde, und nehmen nicht nur eine Seite, die nicht gespeichert werden soll und Speichern, ohne es erneut zu überprüfen, was unter anderem zu allen möglichen seltsamen Sitzungsproblemen führt.
Ich füge dies nur hinzu, falls jemand vorbeikommt und nicht herausfinden kann, warum er Sitzungsfehler mit bestimmten iPhones und iPads bekommt, die bei weitem die schlimmsten Straftäter in diesem Bereich zu sein scheinen.
Ich habe mit diesem Problem ziemlich umfangreiche Debugger-Tests durchgeführt, und dies ist meine Schlussfolgerung, dass die Geräte diese Anweisungen vollständig ignorieren.
Selbst bei regelmäßiger Verwendung habe ich festgestellt, dass einige Mobiltelefone auch nicht nach neuen Versionen suchen, z. B. Expires: 0, und dann die letzten Änderungsdaten überprüfen, um festzustellen, ob sie eine neue erhalten sollten.
Es passiert einfach nicht, also musste ich Abfragezeichenfolgen zu den CSS / JS-Dateien hinzufügen, die ich zum Erzwingen von Updates benötigte, was die dummen Mobilgeräte dazu verleitet, zu glauben, dass es sich um eine Datei handelt, die es nicht gibt, wie zum Beispiel: my .css? v = 1, dann v = 2 für ein CSS / JS-Update. Dies funktioniert weitgehend.
Übrigens können Benutzerbrowser, wenn sie ab 2016 ihren Standardeinstellungen überlassen bleiben, wie ich ständig feststelle (wir nehmen viele Änderungen und Aktualisierungen an unserer Website vor), auch nicht nach den letzten Änderungsdaten für solche Dateien suchen, sondern nach der Abfrage Die String-Methode behebt dieses Problem. Dies ist etwas, das mir bei Kunden und Büromitarbeitern aufgefallen ist, die dazu neigen, grundlegende normale Benutzerstandards in ihren Browsern zu verwenden, und keine Kenntnis von Caching-Problemen mit CSS / JS usw. haben, die die neuen CSS / JS fast immer nicht ändern können. Dies bedeutet, dass die Standardeinstellungen für ihre Browser, hauptsächlich MSIE / Firefox, nicht das tun, was ihnen gesagt wurde. Sie ignorieren Änderungen und ignorieren die zuletzt geänderten Daten und validieren nicht, selbst wenn Expires: 0 explizit festgelegt ist.
Dies war ein guter Thread mit vielen guten technischen Informationen, aber es ist auch wichtig zu beachten, wie schlecht die Unterstützung für dieses Zeug auf besonders mobilen Geräten ist. Alle paar Monate muss ich weitere Schutzschichten hinzufügen, damit sie den empfangenen Header-Befehlen nicht folgen oder diese Befehle ordnungsgemäß interpretieren.
Eine Sache, die (überraschenderweise) nicht erwähnt wurde, ist, dass eine Anfrage explizit angeben kann, dass sie veraltete Daten unter Verwendung der max-stale
Direktive akzeptiert . In diesem Fall würde der max-age=0
Cache , wenn der Server mit geantwortet hätte, lediglich die veraltete Antwort berücksichtigen und ihn verwenden, um die Anforderung des Clients zu erfüllen [die nach möglicherweise veralteten Daten fragte]. Wenn der Server dagegen sendet no-cache
, übertrumpft dies tatsächlich jede Anforderung des Clients (mit max-stale
) nach veralteten Daten, da der Cache erneut validiert werden MUSS.
Der Unterschied besteht darin, dass kein Cache (kein Speicher in Firefox) jegliche Art von Caching verhindert. Dies kann nützlich sein, um zu verhindern, dass Seiten mit sicherem Inhalt auf die Festplatte geschrieben werden, und für Seiten, die immer aktualisiert werden sollten, auch wenn sie mit der Schaltfläche "Zurück" erneut aufgerufen werden.
max-age = 0 gibt an, dass ein Cache-Eintrag veraltet ist und eine erneute Validierung erfordert, verhindert jedoch nicht das Caching. Häufig überprüfen Browser Ressourcen nur einmal pro Browsersitzung, sodass der Inhalt möglicherweise erst aktualisiert wird, wenn die Site in einer neuen Sitzung besucht wird.
Normalerweise löschen Browser abgelaufene Cache-Einträge nicht, es sei denn, sie beanspruchen den Speicherplatz für neuere Inhalte zurück, wenn der Browser-Cache voll ist. Wenn Sie no-store, no-cache verwenden, kann ein Cache-Eintrag explizit gelöscht werden.
max-age=0
wenn Sie meinen, dass das Caching zulässig ist, die Ressource jedoch erneut validiert werden sollte und no-store
wenn Sie nicht möchten, dass die Antwort überhaupt im Cache gespeichert wird. Die no-cache
zufällig entweder von diesen bezeichnet bedeuten , je nach User - Agent - Hersteller und Versionsnummer und Übertragungsprotokoll.