Maximales Alter der HTTP-Cache-Steuerung, muss erneut validiert werden

72

Ich habe ein paar Fragen zu Cache-Control.

Wenn ich Cache-Control max-age=3600, must-revalidatefür eine statische HTML / js / images / css-Datei mit dem zuletzt geänderten Header im HTTP-Header spezifiziere :

  1. Geht der Browser- / Proxy-Cache (wie Squid / Akamai) bis zum Ursprungsserver, um vor Ablauf des Höchstalters zu validieren ? Oder werden Inhalte aus dem Cache bereitgestellt, bis das maximale Alter abgelaufen ist?
  2. Gibt es nach Ablauf des Höchstalters (dh Ablauf aus dem Cache) eine If-Modified-Since-Prüfung oder wird der Inhalt ohne If-Modified-Since-Prüfung erneut vom Ursprungsserver heruntergeladen?
nyb
quelle

Antworten:

55

a) Wenn der Server diesen Header enthält:

Cache-Control "max-age=3600, must-revalidate"

Es teilt sowohl Client-Caches als auch Proxy-Caches mit, dass sie, sobald der Inhalt veraltet ist (älter als 3600 Sekunden), auf dem Ursprungsserver erneut validiert werden müssen, bevor sie den Inhalt bereitstellen können. Dies sollte das Standardverhalten von Caching-Systemen sein, aber die must-revalidateDirektive macht diese Anforderung eindeutig.

b) Der Client sollte erneut validieren. Möglicherweise werden die Header If-Matchoder If-None-Matchmit einem ETag erneut validiert, oder es werden die Header If-Modified-Sinceoder If-Unmodified-Sincemit einem Datum verwendet.

james.garriss
quelle
8
Für mich ist das Protokoll hier etwas mehrdeutig, aber in der Praxis habe ich festgestellt, dass ein erneutes Validieren bedeutet, dass es unabhängig vom Höchstalter erneut validiert werden muss.
ColinM
3
@ColinM, was meinst du? must-revalidate bedeutet, dass es nur dann revalidiert werden muss, wenn das maximale Alter erreicht ist. nein?
Pacerier
7
Ich nenne diese Antwort "Zitat benötigt". Es scheint eine Debatte darüber zu geben, ob es korrekt ist.
Andrewrk
19
Gemäß RFC2616 [1] "Wenn die Direktive" 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 sie zuvor mit dem Ursprungsserver erneut zu validieren." Dies bedeutet, dass die offizielle Spezifikation mit der Antwort übereinstimmt und nicht mit @ColinM. w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
andrewrk
4
@ superjoe30 Ich stimme zu, dass die Antwort laut RFC korrekt ist. In meinem Kommentar wurde nur darauf hingewiesen, dass in der Praxis einige Caches "Max-Age" im Wesentlichen ignorieren, wenn "Must-Revalidate" vorhanden ist. Leider habe ich diese Tests vor langer Zeit durchgeführt und weiß nicht mehr, welche speziell. Insgesamt bin ich ziemlich enttäuscht über die Einhaltung der RFC der meisten Caching-Reverse-Proxys (Nginx, Apache, Cloudfront usw.) und insbesondere der mangelnde Unterstützung für Dinge wie echte serverseitige Inhaltsverhandlung.
ColinM
4

ein. Schauen Sie sich die Registerkarte "Statistiken" auf dieser Seite an und sehen Sie, was passiert.

b. Nach Ablauf prüft der Browser auf dem Server, ob die Datei aktualisiert wurde. Wenn nicht, antwortet der Server mit einem 304 Not ModifiedHeader und es wird nichts heruntergeladen.

Sie können dieses Verhalten selbst überprüfen, indem Sie das Fenster "Net" in Firebug oder ähnlichen Tools aufrufen. Geben Sie einfach die URL erneut in die Adressleiste ein und vergleichen Sie die Anzahl der HTTP-Anforderungen mit der Anzahl der Anforderungen, wenn Ihr Cache leer ist.

Marcel Korpel
quelle
0

Die gegebenen Antworten sind falsch, zumindest für Webbrowser im Jahr 2019.

"Nach Ablauf prüft der Browser auf dem Server, ob die Datei aktualisiert wurde" <- nicht wahr

Ich habe eine statische Datei mit "Cache-Control: public, must-revalidate, max-age = 864000" und sowohl Chrome als auch Firefox stellen jedes Mal eine Anfrage (und erhalten jedes Mal eine 304 Not Modified zurück).

mhenry1384
quelle