Was ist der Unterschied zwischen Cache-Control: max-age = 0 und no-cache?

Antworten:

596

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-ControlHeader 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").


Beim Senden vom Ursprungsserver

Ich glaube max-age=0einfach 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-ModifiedHeader) , bevor Sie eine Cache - Kopie verwenden, während no-cachesie 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 WarningHeader hinzufügen müssen ), no-cachesagen 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-revalidateim 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-cacheund gleichzeitig die offensichtliche Migration no-cachezu vermeiden , das Gleiche zu tun wie no-store(dh überhaupt kein Caching)?


Wenn vom Benutzeragenten gesendet

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-ModifiedHeader) 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.

Michael Krebs
quelle
9
Wäre Cache-Kontrolle nicht: max-age = 0, must-revalidate, proxy-revalidate die exakte Äquivalenz von no-cache?
Didier A.
1
Tolle Antwort, ich habe den Artikel auf Ihrer Website gelesen, aber die Seite ist nicht mehr gültig. palisade.plynt.com/issues/2008Jul/cache-control-attributes
Craig London
7
Danke, @CraigLondon. Ich habe es auf eine zwischengespeicherte Version umgeleitet.
Michael Krebs
2
must-revalidatesoll NICHT mit no-cacheoder 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.
Patanjali
3
@Patanjali " umgeht 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.
Franklin Yu
57

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.

Gunnar Cheng
quelle
31
Das ist falsch. Schicht-Aktualisierung ist eine harte Aktualisierung, die ähnlicher istno-store
Michael
3
Verifiziert in Firefox 45.0, das wie Chrome 49.0.2623.87 m auch bei Umschalt + Aktualisierung ein "Pragma: kein Cache" sendet.
Cees Timmerman
34

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 .

El Yobo
quelle
4
In ähnlicher Weise stößt IE 8 auf alle möglichen Probleme beim Herunterladen, wenn kein Cache über https verwendet wird. Vorgeschlagene Vorsätze beinhalten manchmal das Ändern der Überschriften auf max-age = 0
Robert Christ
28

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-cacheAntworten mit derselben Semantik wie max-age=0,must-revalidate. Firefox 3.5 scheint jedoch no-cacheals gleichwertig zu gelten no-store, was die Leistung und die Bandbreitennutzung beeinträchtigt.

Squid Cache scheint standardmäßig niemals etwas mit einem no-cacheHeader zu speichern , genau wie Firefox.

Mein Rat wäre, public,max-age=0nicht 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-cachevö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=0oder no-cachezufällig.

Rmalayter
quelle
2
Beste Antwort für passwortgeschützte Inhalte. private,max-age=0.
Dana
21
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 :)

shahkalpesh
quelle
12

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=0kö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-cachenicht tun würden .

Hank Gay
quelle
Guter Punkt, aber in der Praxis macht das tatsächlich ein Browser?
Pacerier
3
@ Pacerier Ich denke, dies ist mehr für das Zwischenspeichern von Proxy-Servern wie Varnish, Squid, Traffic usw.
Hank Gay
12

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

Lizardx
quelle
css und js sind geeignete Kandidaten für das Caching, da sie sich in Produktionssystemen nicht oft ändern sollten. Das Caching für sie während der Entwicklung ist jedoch ein Schmerz, da diese Aktivität häufiges erzwungenes Cache-Flushing erfordern kann. Wenn jedoch keine unterschiedlichen Einstellungen für die verschiedenen Umgebungen verwendet werden können, sollten die Produktionsanforderungen Vorrang haben, da dies den größten Effekt hat, da die weitaus größere Anzahl von Zugriffen Bandbreite spart, verglichen mit den wenigen Strg-F5-Aktualisierungen, die einige Entwickler haben werden machen. Das Abfragen von Echtzeitdaten erfordert jedoch, dass die Cache-Steuerung ordnungsgemäß funktioniert.
Patanjali
0

Eine Sache, die (überraschenderweise) nicht erwähnt wurde, ist, dass eine Anfrage explizit angeben kann, dass sie veraltete Daten unter Verwendung der max-staleDirektive akzeptiert . In diesem Fall würde der max-age=0Cache , 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.

Ethan
quelle
-2

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.

HttpWatchSupport
quelle
9
Soweit ich weiß, soll "kein Cache" die Speicherung NICHT verhindern ("kein Speicher" ist der richtige Weg, um dies zu erreichen). Interpretieren bestimmte Browser "No-Cache" als "No-Store"? Das würde erklären, warum 'max-age = 0' anstelle von 'no-cache' verwendet wird
rubyruy
3
Das ist falsch. Siehe oben. Einige Browser / Server können wählen no-cache als No-Speicher zu implementieren, aber nicht alle.
Jeremy Kauffman
4
Der einzig sichere Weg ist die Verwendung, max-age=0wenn Sie meinen, dass das Caching zulässig ist, die Ressource jedoch erneut validiert werden sollte und no-storewenn Sie nicht möchten, dass die Antwort überhaupt im Cache gespeichert wird. Die no-cachezufällig entweder von diesen bezeichnet bedeuten , je nach User - Agent - Hersteller und Versionsnummer und Übertragungsprotokoll.
Mikko Rantalainen
Wann verwendet Firefox No-Store?
Cees Timmerman