Aus dem RFC 2616
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
kein Cache
Wenn die Direktive ohne Cache keinen Feldnamen angibt, darf ein Cache 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.
Daher werden die Agenten angewiesen, alle Antworten erneut zu validieren .
Verglichen mit
muss-revalidieren
Wenn die Anweisung must-revalidate in einer von einem Cache empfangenen Antwort vorhanden ist, darf dieser Cache den Eintrag NICHT verwenden, nachdem er veraltet ist, um auf eine nachfolgende Anforderung zu antworten, ohne ihn zuvor mit dem Ursprungsserver erneut zu validieren
Daher werden die Agenten angewiesen, veraltete Antworten erneut zu validieren .
Behandeln no-cache
Benutzeragenten diese Richtlinie insbesondere empirisch so empirisch?
Was bringt es, no-cache
wenn es must-revalidate
und gibt max-age
?
Siehe diesen Kommentar:
http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/
kein Cache
Obwohl diese Anweisung den Browser anweist, die Seite nicht zwischenzuspeichern, gibt es einen subtilen Unterschied. Die Direktive "kein Cache" weist den Browser laut RFC an, dass sie mit dem Server erneut validiert werden soll, bevor die Seite aus dem Cache bereitgestellt wird. Die Revalidierung ist eine nette Technik, mit der die Anwendung die Bandbreite erhalten kann. Wenn sich die vom Browser zwischengespeicherte Seite nicht geändert hat, signalisiert der Server dies nur dem Browser und die Seite wird aus dem Cache angezeigt. Daher speichert der Browser (zumindest theoretisch) die Seite in seinem Cache, zeigt sie jedoch erst nach erneuter Validierung mit dem Server an. In der Praxis haben IE und Firefox damit begonnen, die Direktive ohne Cache 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.
Hat jemand etwas offizielleres dazu?
Aktualisieren
Die Richtlinie "Muss erneut validiert werden" sollte von Servern nur dann verwendet werden, wenn die Nichtvalidierung einer Anforderung in der Darstellung zu einem fehlerhaften Vorgang führen kann, z. B. zu einer stillschweigend nicht ausgeführten Finanztransaktion.
Das habe ich mir bis jetzt noch nie zu Herzen genommen. Der RFC sagt, dass Must-Revalidate nicht leichtfertig verwendet werden soll. Die Sache ist, dass Sie bei Webdiensten eine negative Meinung vertreten und das Schlimmste für Ihre unbekannten Client-Apps annehmen müssen. Jede veraltete Ressource kann ein Problem verursachen.
Und noch etwas, das ich gerade in Betracht gezogen habe: Ohne Last-Modified oder ETags kann der Browser nur die gesamte Ressource erneut abrufen. Bei ETags habe ich jedoch festgestellt, dass Chrome zumindest bei jeder Anfrage erneut validiert zu werden scheint. Dies führt dazu, dass diese beiden Direktiven strittig oder zumindest schlecht benannt sind, da sie nicht ordnungsgemäß erneut validiert werden können, es sei denn, die Anforderung enthält auch andere Header, die dann ohnehin "immer erneut validieren" verursachen.
Ich möchte nur diesen letzten Punkt klarer machen. Durch einfaches Einstellen, must-revalidate
aber ohne Einschließen eines ETag oder Last-Modified kann der Agent den Inhalt nur erneut abrufen, da er nichts zum Vergleichen an den Server senden muss.
Meine empirischen Tests haben jedoch gezeigt, dass die Agenten, wenn ETag oder geänderte Headerdaten in Antworten enthalten sind, unabhängig vom Vorhandensein des must-revalidate
Headers immer wieder validieren .
Der Punkt von must-revalidate
ist also, einen "Bypass-Cache" zu erzwingen, wenn er veraltet ist. Dies kann nur passieren, wenn Sie eine Lebensdauer / ein Alter festgelegt haben. Wenn must-revalidate
also eine Antwort ohne Alter oder andere Header festgelegt ist, wird sie effektiv gleichbedeutend mit " no-cache
seitdem" Die Antwort wird sofort als veraltet betrachtet.
- Also werde ich endlich Gilis Antwort markieren!
quelle
Antworten:
Ich glaube das
must-revalidate
bedeutet:Während
no-cache
impliziert:Wenn eine Antwort 10 Sekunden lang zwischengespeichert werden kann, wird sie
must-revalidate
nach 10 Sekunden aktiviert , währendno-cache
diesmust-revalidate
nach 0 Sekunden impliziert wird .Zumindest ist das meine Interpretation.
quelle
max-age=0, must-revalidate
undno-cache
identisch sindmust-revalidate
undno-cache
haben eine andere Bedeutung für neue Antworten: Wenn eine zwischengespeicherte Antwort frisch ist (dh die Antwort nicht abgelaufen ist),must-revalidate
wird der Proxy sie sofort bereitstellen, ohne sie erneut mit dem Server zu validieren, währendno-cache
der Proxy die erneut validieren muss zwischengespeicherte Antwort unabhängig von der Frische. Quelle: "HTTP - The Definitive Guide", Seiten 182-183.no-cache
max-age=0, must-revalidate
max-age=0, must-revalidate
undno-cache
sind nicht genau identisch. Mitmust-revalidate
, wenn der Server auf eine Revalidierung Anfrage nicht reagiert, der Browser / Proxy sollte einen 504 - Fehler zurück. Mitno-cache
würde nur der zwischengespeicherte Inhalt angezeigt, der wahrscheinlich vom Benutzer bevorzugt wird (besser, etwas veraltetes als gar nichts zu haben). Aus diesem Grundmust-revalidate
ist dies nur für kritische Transaktionen vorgesehen.quelle
no-cache
Interpretation. Aus dem RFC 7234 Die Antwortanweisung "kein Cache" gibt an, dass die Antwort NICHT verwendet werden darf, um eine nachfolgende Anforderung ohne erfolgreiche Validierung auf dem Ursprungsserver zu erfüllen. Auf diese Weise kann ein Ursprungsserver verhindern, dass ein Cache ihn verwendet, um eine Anforderung zu erfüllen, ohne ihn zu kontaktieren, selbst durch Caches, die für das Senden veralteter Antworten konfiguriert wurden. Dies klingt ähnlich wie Einschränkungen fürmust-revalidate
must-validate
bedeutetmust-refresh
Mit Jeffrey Fox 'Interpretation über
no-cache
, die ich unter Chrome 52.0.2743.116 m getestet habe, zeigt das Ergebnis, dassno-cache
es dasselbe Verhalten hat wiemust-revalidate
, dass sie alle KEINEN lokalen Cache verwenden, wenn der Server nicht erreichbar ist, und dass sie alle den Cache verwenden, während sie auf Zurück des Browsers tippen / Weiterleiten-Schaltfläche, wenn der Server nicht erreichbar ist. Wie oben denke ich,max-age=0, must-revalidate
istno-cache
zumindest in der Implementierung identisch mit .quelle
Ich denke, es gibt einen Unterschied zwischen
max-age=0, must-revalidate
undno-cache
:In dem
must-revalidate
Fall darf der Client eineIf-Modified-Since
Anfrage senden und die Antwort aus dem Cache bedienen, wenn sie304 Not Modified
zurückgegeben wird.In diesem
no-cache
Fall darf der Client die Antwort nicht zwischenspeichern und sollte sie daher nicht verwendenIf-Modified-Since
.quelle
no-cache
bedeutet nichtno-store
- mitno-cache
, kann die Ressource noch in dem Client zwischengespeichert werden; muss es nur vor der Verwendung erneut validiert werden?no-cache
undno-store
.no-cache
bedeutet , dass die Ressource sein muss erneut validiert . Revalidate enthält die Option, bedingte Anforderungen wieIf-None-Match
und zu verwendenIf-Modified-Since
.