741 Stimmen

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

Die Überschrift Cache-Control: max-age=0 impliziert, dass der Inhalt als veraltet betrachtet wird (und sofort neu geholt werden muss), was im Grunde dasselbe ist wie Cache-Control: no-cache .

685voto

Michael Krebs Punkte 7611

Ich hatte dieselbe Frage und habe bei meiner Suche einige Informationen gefunden (Ihre Frage war eines der Ergebnisse). Hier ist, was ich herausgefunden habe...

Das Thema hat zwei Seiten Cache-Control Kopfzeile. Auf der einen Seite kann er vom Webserver (auch "Ursprungsserver" genannt) gesendet werden. Auf der anderen Seite kann er vom Browser (auch "User Agent" genannt) gesendet werden.


Wenn vom Ursprungsserver gesendet

Ich glaube max-age=0 sagt den Caches (und User-Agents) einfach, dass die Antwort von Anfang an veraltet ist und sie daher SHOULD die Antwort erneut validieren (z. B. mit dem If-Not-Modified Header), bevor eine zwischengespeicherte Kopie verwendet wird, während, no-cache sagt ihnen, dass sie MUSS vor der Verwendung einer zwischengespeicherten Kopie erneut validieren. Von 14.9.1 Was ist cachefähig? :

no-cache

...ein Cache MUSS die Antwort NICHT verwenden zur Befriedigung einer nachfolgenden Anfrage ohne erfolgreiche Revalidierung mit dem dem Ursprungsserver. Dies erlaubt einem Ursprungsserver das Caching auch durch von Caches zu verhindern, die so konfiguriert sind, dass sie veraltete Antworten auf Client Anfragen zurückgeben.

Mit anderen Worten, Caches können sich manchmal dafür entscheiden, eine veraltete Antwort zu verwenden (obwohl ich glaube, dass sie dann eine Warning Kopfzeile), sondern no-cache sagt, dass sie eine veraltete Antwort nicht verwenden dürfen, egal was passiert. Vielleicht sollten Sie die SHOULD -Revalidate-Verhalten, wenn Baseball-Statistiken in einer Seite generiert werden, aber Sie würden die MUSS -Verhalten zu überprüfen, wenn Sie die Antwort auf einen E-Commerce-Kauf erstellt haben.

Obwohl Sie mit Ihrem Kommentar Recht haben, wenn Sie sagen no-cache nicht dazu gedacht ist, die Speicherung zu verhindern, könnte es tatsächlich ein weiterer Unterschied sein, wenn man no-cache . Ich bin auf eine Seite gestoßen, Cache-Kontrollrichtlinien entmystifiziert die besagt (ich kann nicht für die Richtigkeit bürgen):

In der Praxis haben IE und Firefox begonnen, die no-cache Anweisung so zu behandeln, als würde sie den Browser anweisen Browser anweist, die Seite gar nicht zu cachen. Wir beobachteten dieses Verhalten vor etwa einem Jahr. Wir vermuten, dass dass diese Änderung durch die weit verbreitete (und falsche) Verwendung dieser Direktive zur Verhinderung von Caching.

...

Beachten Sie, dass in letzter Zeit "cache-control: no-cache" sich auch wie die Direktive wie die Richtlinie "no-store".

Nebenbei bemerkt, scheint es mir, dass Cache-Control: max-age=0, must-revalidate sollte im Grunde das Gleiche bedeuten wie Cache-Control: no-cache . Vielleicht ist das also eine Möglichkeit, die MUSS -Validierung des Verhaltens von no-cache bei gleichzeitiger Vermeidung der offensichtlichen Migration von no-cache das Gleiche zu tun wie no-store (d. h. keinerlei Zwischenspeicherung)?


Wenn vom Benutzeragenten gesendet

Ich glaube shahkalpeshs Antwort gilt für die User-Agent-Seite. Sie können sich auch ansehen 13.2.6 Disambiguierung mehrerer Antworten .

Wenn ein User-Agent eine Anfrage sendet mit Cache-Control: max-age=0 (auch bekannt als "Ende-zu-Ende-Revalidierung"), dann wird jeder Cache entlang des Weges seinen Cache-Eintrag revalidieren (z. B. mit dem If-Not-Modified Header) bis hin zum Ursprungsserver. Wenn die Antwort dann 304 (Not Modified) lautet, kann die zwischengespeicherte Entität verwendet werden.

Andererseits ist das Senden einer Anfrage mit Cache-Control: no-cache (auch bekannt als "end-to-end reload") nicht neu validiert und der Server MUSS NICHT bei der Beantwortung eine zwischengespeicherte Kopie verwenden.

56voto

G. Cheng Punkte 1241

max-age=0

Dies ist gleichbedeutend mit einem Klick auf Auffrischen Das bedeutet, dass Sie mir die neueste Kopie geben sollen, es sei denn, ich habe bereits die neueste Kopie.

no-cache

Dies hält Schicht während Sie auf Aktualisieren klicken, was bedeutet, dass Sie einfach alles neu machen, egal was passiert.

37voto

El Yobo Punkte 14434

Die Frage ist zwar schon alt, aber falls noch jemand bei einer Suche darauf stößt, so wie ich es getan habe, scheint der IE9 dies zu nutzen, um das Verhalten von Ressourcen bei Verwendung der Schaltflächen "Zurück" und "Vor" zu konfigurieren. Wenn max-age=0 verwendet wird, verwendet der Browser die letzte Version, wenn eine Ressource durch Drücken der Taste "Zurück/Vorwärts" angezeigt wird. Wenn no-cache verwendet wird, wird die Ressource erneut abgerufen.

Weitere Einzelheiten zum IE9-Caching finden Sie hier msdn caching blog post .

31voto

rmalayter Punkte 499

Meine jüngsten Tests mit IE8 und Firefox 3.5 haben ergeben, dass beide RFC-konform sind. Sie unterscheiden sich jedoch in ihrer "Freundlichkeit" gegenüber dem Ursprungsserver. Der IE8 behandelt no-cache Antworten mit der gleichen Semantik wie max-age=0,must-revalidate . Firefox 3.5 scheint jedoch die no-cache als gleichwertig zu no-store was sich negativ auf die Leistung und die Bandbreitennutzung auswirkt.

Squid Cache scheint standardmäßig nie etwas mit einer no-cache Kopfzeile, genau wie Firefox.

Mein Rat wäre, die public,max-age=0 für nicht sensible Ressourcen, die bei jeder Anfrage auf Aktualität geprüft werden sollen, aber dennoch die Leistungs- und Bandbreitenvorteile des Caching nutzen können. Für benutzerspezifische Elemente mit den gleichen Überlegungen verwenden Sie private,max-age=0 .

Ich würde die Verwendung von no-cache vollständig zu entfernen, da sie von einigen Browsern und gängigen Caches zum funktionalen Äquivalent von no-store .

Außerdem sollten Sie nicht Akamai und Limelight nacheifern. Sie betreiben zwar in erster Linie riesige Caching-Arrays und sollten Experten sein, aber sie haben ein ureigenes Interesse daran, dass mehr Daten aus ihren Netzen heruntergeladen werden. Auch Google ist möglicherweise keine gute Wahl für eine Nachahmung. Sie scheinen zu verwenden max-age=0 o no-cache nach dem Zufallsprinzip je nach Ressource.

23voto

shahkalpesh Punkte 32505
max-age
    When an intermediate cache is forced, by means of a max-age=0 directive, to revalidate 
its own cache entry, and the client has supplied its own validator in the request, the 
supplied validator might differ from the validator currently stored with the cache entry. 
In this case, the cache MAY use either validator in making its own request without 
affecting semantic transparency. 

    However, the choice of validator might affect performance. The best approach is for the 
intermediate cache to use its own validator when making its request. If the server replies 
with 304 (Not Modified), then the cache can return its now validated copy to the client 
with a 200 (OK) response. If the server replies with a new entity and cache validator, 
however, the intermediate cache can compare the returned validator with the one provided in 
the client's request, using the strong comparison function. If the client's validator is 
equal to the origin server's, then the intermediate cache simply returns 304 (Not 
Modified). Otherwise, it returns the new entity with a 200 (OK) response. 
 **If a request includes the no-cache directive, it SHOULD NOT include min-fresh, 
max-stale, or max-age.** 

Höflichkeit: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Akzeptieren Sie dies nicht als Antwort - ich muss es lesen, um die wahre Verwendung zu verstehen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X