Unterschied zwischen No-Cache und Must-Revalidate

178

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-cacheBenutzeragenten diese Richtlinie insbesondere empirisch so empirisch?

Was bringt es, no-cachewenn es must-revalidateund 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-revalidateaber 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-revalidateHeaders immer wieder validieren .

Der Punkt von must-revalidateist also, einen "Bypass-Cache" zu erzwingen, wenn er veraltet ist. Dies kann nur passieren, wenn Sie eine Lebensdauer / ein Alter festgelegt haben. Wenn must-revalidatealso eine Antwort ohne Alter oder andere Header festgelegt ist, wird sie effektiv gleichbedeutend mit " no-cacheseitdem" Die Antwort wird sofort als veraltet betrachtet.

- Also werde ich endlich Gilis Antwort markieren!

Luke Puplett
quelle
Theoretisch ist der Unterschied also " validate-always" und " validate-if-stale" , während in der Praxis kein Cache von bestimmten Browsern behandelt wird, da der von Ihnen zitierte Kommentar "Never -validate" besagt. Sie sollten also entscheiden, welche davon verwendet werden sollen basierend auf dem Caching-Verhalten, das Sie tatsächlich in der Praxis erreichen möchten…
CBroe
Bitte lesen Sie greenbytes.de/tech/webdav/… und prüfen Sie, ob dies die Dinge für Sie klarstellt.
Julian Reschke
Überprüfen Sie diesen Entscheidungsbaum für die Antwort stackoverflow.com/a/49925190/3748498
pravdomil

Antworten:

191

Ich glaube das must-revalidatebedeutet:

Wenn der Cache abgelaufen ist, lehnen Sie es ab, veraltete Antworten an den Benutzer zurückzugeben, selbst wenn er sagt, dass veraltete Antworten akzeptabel sind.

Während no-cacheimpliziert:

must-revalidate plus die Tatsache, dass die Antwort sofort abgestanden wird.

Wenn eine Antwort 10 Sekunden lang zwischengespeichert werden kann, wird sie must-revalidatenach 10 Sekunden aktiviert , während no-cachedies must-revalidatenach 0 Sekunden impliziert wird .

Zumindest ist das meine Interpretation.

Gili
quelle
2
So sehe ich es jetzt. Der interessante Teil ist mein letzter Absatz, ohne ETag oder Last-Modified hat der Agent nichts zu verwenden, um zu überprüfen, was er im Cache hat, und muss die gesamte Nutzlast erneut herunterladen. Wenn der RFC "revalidate" sagt, bedeutet dies wahrscheinlich "erneut abrufen".
Luke Puplett
44
Was auch bedeutet max-age=0, must-revalidateund no-cacheidentisch sind
Anshul
5
@Anshul, zuerst dachte ich, Sie hätten Recht, dass 'max-age = 0, must-revalidate und no-cache identisch sind', aber siehe Jeffrey Fox 'Antwort, die darauf hinweist, dass das nicht ganz richtig ist.
Don Hatch
2
@Anshul Nein, must-revalidateund no-cachehaben eine andere Bedeutung für neue Antworten: Wenn eine zwischengespeicherte Antwort frisch ist (dh die Antwort nicht abgelaufen ist), must-revalidatewird der Proxy sie sofort bereitstellen, ohne sie erneut mit dem Server zu validieren, während no-cacheder Proxy die erneut validieren muss zwischengespeicherte Antwort unabhängig von der Frische. Quelle: "HTTP - The Definitive Guide", Seiten 182-183.
Matthias Braun
8
@MatthiasBraun Ah, ich kann die Quelle der Verwirrung sehen. no-cachemax-age=0, must-revalidate
Vielleicht
24

max-age=0, must-revalidateund no-cachesind nicht genau identisch. Mit must-revalidate, wenn der Server auf eine Revalidierung Anfrage nicht reagiert, der Browser / Proxy sollte einen 504 - Fehler zurück. Mit no-cachewürde nur der zwischengespeicherte Inhalt angezeigt, der wahrscheinlich vom Benutzer bevorzugt wird (besser, etwas veraltetes als gar nichts zu haben). Aus diesem Grund must-revalidateist dies nur für kritische Transaktionen vorgesehen.

Jeffrey Fox
quelle
10
Ich bin mir nicht sicher über deine no-cacheInterpretation. 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
Anshul
9
Hat Jeffrey Beweise dafür, dass sich Implementierungen so verhalten, wie er es beschrieben hat?
OrangeDog
Ich denke, diese Antwort ist richtig für Proxy / lb-Server. In diesem Fall geben Browser jedoch keinen 504 zurück.
Yann Dìnendal
Also must-validatebedeutetmust-refresh
Simon_Weaver
15

Mit Jeffrey Fox 'Interpretation über no-cache, die ich unter Chrome 52.0.2743.116 m getestet habe, zeigt das Ergebnis, dass no-cachees dasselbe Verhalten hat wie must-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-revalidateist no-cachezumindest in der Implementierung identisch mit .

Wilson Zeng
quelle
Verwendet Chrome den lokalen Cache, wenn der Server für eine erneute Validierung verfügbar ist? (dh "If-Modified-Since"). In beiden Fällen?
Rich
-2

Ich denke, es gibt einen Unterschied zwischen max-age=0, must-revalidateund no-cache:

In dem must-revalidateFall darf der Client eine If-Modified-SinceAnfrage senden und die Antwort aus dem Cache bedienen, wenn sie 304 Not Modifiedzurückgegeben wird.

In diesem no-cacheFall darf der Client die Antwort nicht zwischenspeichern und sollte sie daher nicht verwenden If-Modified-Since.

Reich
quelle
6
Aber no-cachebedeutet nicht no-store- mit no-cache, kann die Ressource noch in dem Client zwischengespeichert werden; muss es nur vor der Verwendung erneut validiert werden?
Aron
4
Sie verschmelzen no-cacheund no-store. no-cachebedeutet , dass die Ressource sein muss erneut validiert . Revalidate enthält die Option, bedingte Anforderungen wie If-None-Matchund zu verwenden If-Modified-Since.
Jules Randolph
1
@ JulesRandolph: Sie können recht haben. Hast du irgendwelche Tests / Demos? Alle widersprüchlichen evidenzfreien Behauptungen zu diesem q sind frustrierend. Sogar die akzeptierte Antwort sagt nur "Zumindest ist das meine Interpretation". Ich könnte einen Prüfstand aufstellen und hier posten, wenn ich etwas Zeit habe.
Rich