web-dev-qa-db-ger.com

Stellen Sie sicher, dass IE die Ressourcen zwischenspeichern, aber immer erneut validieren

Der Cache-Steuerelement-Header "No-Cache, muss erneut validiert werden, privat" ermöglicht Browsern das Zwischenspeichern der Ressource, erzwingt jedoch eine erneute Validierung mit bedingten Anforderungen. Dies funktioniert wie erwartet in FF, Safari und Chrome.

IE7 + 8 sendet jedoch keine bedingte Anforderung, dh "If-Modified-Since" fehlt im Anforderungsheader, und daher antwortet der Server mit HTTP/200 anstelle von HTTP/304.

Hier sind die vollständigen Header der Serverantwort:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Content-type: text/html;charset=utf-8
Content-Length: 10835
Date: Wed, 16 Feb 2011 13:52:26 GMT
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, private

Dies scheint ein IE Bug zu sein, aber ich habe nichts im Zusammenhang mit dem Web gefunden, daher frage ich mich, ob die Abwesenheit oder Existenz eines anderen Headers IE = sich seltsam verhalten?

Eine gute Diskussion über den Unterschied zwischen No-Cache und Max-Age: Was ist der Unterschied zwischen Cache-Control: Max-Age = 0 und No-Cache?

43
alienhard

Ich habe es schließlich herausgefunden. Hier ist eine Erklärung und eine getestete Lösung.

Die folgende Site bestätigt meine Beobachtung: http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

Es heißt, dass IE Seiten mit der Direktive 'no-cache' nicht lokal speichert und daher immer eine unbedingte Anfrage sendet.

Es gibt auch einen MS-Support-Artikel - https://support.Microsoft.com/help/234067/ - der dies bestätigt:

"Internet Explorer unterstützt den HTTP 1.1-Cache-Control-Header, der das gesamte Caching einer bestimmten Webressource verhindert, wenn der Wert no-cache angegeben wird ..."

Dieses Verhalten ist nicht ganz falsch - aber es ist nicht das, was RFC 2616 (Abschnitt 14.9.1) beabsichtigt hat. Über 'no-cache' heißt es: "... ein Cache DARF NICHT die Antwort verwenden, um eine nachfolgende Anfrage ohne erfolgreiche Neuvalidierung mit dem Origin-Server zu erfüllen." Die Antwort kann also zwischengespeichert werden, MUSS jedoch erneut validiert werden. Die wichtigsten Browser, mit Ausnahme des IE, speichern die Antwort im Cache und validieren sie erneut. Um das Speichern der Anfrage zu verhindern, gibt es die Cache-Control-Direktive 'no-store'.

Zusammenfassend behandelt IE 'no-cache' als 'no-store'.

Und hier ist die Lösung, um bedingte Anforderungen für IE und die anderen Browser auf konsistente Weise zu aktivieren:

Verwenden Sie keinen No-Cache, sondern setzen Sie den Expires-Header auf die Vergangenheit (oder -1, was den gleichen Effekt hat). IE sowie die anderen wichtigen Browser senden dann bedingte Anforderungen. (Beachten Sie, dass Sie sich auch des IE Vary-Header-Fehlers bewusst sein sollten, der das Caching verhindert.)

Dies sind die kritischen Header-Felder:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • Last-Modified (oder ETag) wird als Validator benötigt
  • Expires -1 gibt an, dass die Ressource veraltet ist und erneut validiert werden muss
  • Cache-Control darf kein No-Cache oder No-Store enthalten
74
alienhard