Warum respektieren Browser die Cache-Header bei der ersten Seitenanforderung nicht?

8

Ich kratzte mir ein bisschen am Kopf. Eine von mir ausgeführte Drupal-Site legt geeignete Cache-Header fest, die angeben sollen, dass die Seite 15 Minuten lang zwischengespeichert werden kann. Jedes Mal, wenn ich auf die Seite klicke, wird eine GET-Anfrage gesendet, anstatt die Seite aus dem Cache zu laden.

Ich aktualisiere die Seite nicht jedes Mal mit Gewalt, was dem Browser anzeigt, dass ich die Caches leeren möchte. Ich habe kein Cache-Busting im Entwicklermodus aktiviert.

Ist dies nur das Standardverhalten von Browsern oder fehlt mir etwas Offensichtliches? Hier sind die Anforderungs- / Antwort-Header, die von den FireFox-Entwicklungstools auf meine Homepage gelangen:

HINWEIS / BEARBEITEN : Einige Leute haben vorgeschlagen, dass dies mit dem ExpiresHeader in der Vergangenheit zusammenhängt. Allerdings Cache-Controlüberschreibt alles in Expireswie beschrieben in RFC 2616 , Abschnitt 14.9.3. Drupal enthält dies, um das Caching auf älteren HTTP 1.0-Clients zu deaktivieren, die den erweiterten VaryHeader nicht unterstützen, den Drupal für das ordnungsgemäße Caching benötigt.

Geben Sie hier die Bildbeschreibung ein

Brian
quelle

Antworten:

11

Sie haben einen Vary: Cookie, Accept-Encoding- Header in der Antwort. Das bedeutet so ziemlich, dass der Proxy (einschließlich Ihres Browsers) , wenn er diese Seite zwischenspeichern möchte, darauf vorbereitet sein sollte, eine neue Version für jeden möglicherweise geänderten Cookie-Wert (oder Änderungen in der Akzeptanzcodierung) zwischenzuspeichern. Insbesondere müsste an erster Stelle eine Aufzeichnung der Cookies geführt werden, da diese in der Anfrage als Unterscheidungskriterium gesendet wurden. Ich kann mir vorstellen, dass entweder der Browser dies ablehnt, wenn das Cookie zu groß ist (und daher wahrscheinlich nicht wiederholt wird), oder es leugnet, um zu vermeiden, dass Cookie-Informationen über den Cache-Inhalt verloren gehen, oder einfach der Cookie-Inhalt bei jedem geändert wird Anruf.

Hagen von Eitzen
quelle
4
War gerade dabei, meine eigene Frage zu beantworten, als ich ebenfalls zu diesem Schluss kam. Ich habe Google Analytics-Cookies, von denen sich eines bei jeder Seitenanforderung ändert und verhindert, dass die Seite zwischengespeichert wird.
Brian
2

In CMS-Programmen erfordern einige Seiten eine Interaktion mit der Datenbank, um den dynamischen Inhalt anzuzeigen, der für die Benutzeranforderung spezifisch ist. Die gesamte Seite kann nicht zwischengespeichert werden oder zeigt dem Benutzer nicht den richtigen Inhalt.

Ein Beispiel hierfür ist in der Praxis eine E-Commerce-Warenkorb- / Checkout-Seite. Da die Seite jedes Mal anders aussieht, gibt es keine Möglichkeit, sie vollständig zwischenzuspeichern. Ohne mehr über die spezifische Seite zu wissen, ist es schwierig zu wissen, ob die Seite, auf die Sie verweisen, eine Datenbankbeteiligung erfordert.

JMC
quelle
Dies gilt zwar nicht für den Seiten-Caching-Mechanismus von Drupal (er speichert buchstäblich die gesamte HTML-Ausgabe zwischen und liefert sie für "anonymen" Verkehr) und hängt nicht wirklich mit meiner Frage zusammen. Meine Frage ist, wie Browser scheinbar falsch auf die entsprechenden Seiten-Cache-Header reagieren, die festgelegt wurden (siehe Abbildung).
Brian
Ich habe dies bereits beim Debuggen gesehen, kann mich aber nicht erinnern. Gibt es einen gültigen Grund, warum in Ihrem Antwortheader Expires: Nov 1978 angezeigt wird? Oder das könnte deine Antwort sein.
JMC
1
In Drupals Code lautet der Kommentar über diesem Header: "HTTP / 1.0-Proxys unterstützen den Vary-Header nicht. Verhindern Sie daher das Caching, indem Sie ein Ablaufdatum in der Vergangenheit senden. HTTP / 1.1-Clients ignorieren den Expires-Header, wenn ein Cache-Control: max-age = Direktive ist angegeben (siehe RFC 2616, Abschnitt 14.9.3). " Das Datum ist speziell der Schöpfer von Drupals Geburtstag.
Brian
Es ist immer noch seltsam, dass die Expires nicht übereinstimmen, z. B. Zuletzt geändert plus Höchstalter
Hagen von Eitzen
-1

Zusätzlich zu den anderen Antworten befindet sich der ExpiresHeader in der Vergangenheit. Dies ist auch ein Grund, warum Browser die Seite nicht zwischenspeichern.

Tero Kilkanen
quelle
Dies gilt nicht, wenn ein Cache-ControlHeader vorhanden ist. Es überschreibt den ExpiresHeader für HTTP 1.1-Clients. Siehe ietf.org/rfc/rfc2616.txt , Abschnitt 14.9.3.
Brian