it-swarm.com.de

Der Chrome-Browser sendet keinen if-modified-since-Header an den Server

Ich habe diese Header, die vom Server an den Client gesendet werden:

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT

Ich möchte, dass der Client überprüft, dass sich die Datei nicht auf dem Server geändert hat, und eine "200" senden, wenn ansonsten eine "304" vorhanden ist.

Firefox sendet:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"

Warum sendet der Chrome bei einer Aktualisierung der Seite nicht dasselbe? Ich bin nach dem Verhalten, das .Net ausgeführt hat:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
39
Asken

Meiner Erfahrung nach benötigen Sie mehr als nur den "Private" Cache-Control-Header. Sie benötigen entweder "Max-Age" oder "Expires", um zu erzwingen, dass Chrome Inhalte auf dem Server erneut überprüft. 

Denken Sie daran, dass die erneute Validierung erst nach Ablauf dieser Zeitwerte beginnt. Daher müssen sie möglicherweise auf einen kleinen Wert gesetzt werden.

11
Andy McCluggage

Nachdem ich gestern einen halben Tag damit verbracht hatte, habe ich herausgefunden, was das Problem für mich verursacht hat. Solange Sie den Chrome-Objektinspektor/Client-Debugger/Netzwerkmonitor/Thing haben, der bei Betätigung von F12 angezeigt wird, sendet Chrome keine Header für Cache-Anforderungen. Zeitraum. (Update: In neueren Versionen von Chrome gibt es ein Kontrollkästchen "Cache deaktivieren"). Auch wenn Sie die Registerkarte "Netzwerk" nicht geöffnet haben (z. B. die Javascript-Konsole geöffnet hat), deaktiviert dieses Kontrollkästchen weiterhin alle Zwischenspeicherungen.

Es ist traurig, da das Debuggen auf der Clientseite Sie dazu zwingt, das Netzwerkfenster geöffnet zu lassen, um zu sehen, welche Header gesendet und empfangen werden und welche Codes zurückgegeben werden. Wenn das Netzwerkfenster nicht geöffnet ist, können Sie nicht feststellen, ob Ihr Inhalt von der Clientseite zwischengespeichert wird. 

Wenn Sie Ihre Serverzugriffsprotokolle durchsuchen, werden Sie bemerken, dass Ihr Server 304s (zwischengespeicherte Inhalte) zurückgibt, sobald Sie das Debug-Fenster auf Ihrem Chrome-Client schließen. Hoffe das hilft. 

Chrome 24.0.1312.57

57
Mark

Bei der Verwendung von HTTPS habe ich eine Antwort auf dieses Verhalten gefunden. Ich dachte, ich würde mitteilen, was ich gefunden habe. Sie geben nicht an, ob Sie über HTTP oder HTTPS anfordern.

"Die Regel ist eigentlich ganz einfach: Jeder Fehler des Zertifikats bedeutet, dass die Seite nicht zwischengespeichert wird."

https://code.google.com/p/chromium/issues/detail?id=110649

Wenn Sie ein selbstsigniertes Zertifikat verwenden, wird auch dann, wenn Sie Chrome anweisen, eine Ausnahme hinzufügen, damit die Seite geladen wird, keine Ressourcen dieser Seite zwischengespeichert werden und nachfolgende Anforderungen haben keinen If-Modified-Since-Header.

29
Neek

Zusätzlich ( https://stackoverflow.com/a/14899869/362780 ):

F12> Einstellungen> Allgemein> Cache deaktivieren (bei geöffneten DevTools) -> Auswahl aufheben ...

4
K-Gun

Browser haben viel intuitives Verhalten, wenn es um das Zwischenspeichern geht. Wenn die Antwort ein Datum der letzten Änderung enthält, würden Sie erwarten, dass der Browser dieses erneut überprüft, bevor Sie es erneut verwenden. Das tut aber keiner der großen Browser.

Die idealen Einstellungen für Ihre Situation hängen davon ab, wann der Browser erneut validiert werden soll (siehe Link unten).

Browser reagieren nicht nur intuitiv, sondern auch unterschiedliche Browser in derselben Situation. Zum Beispiel, wenn der Benutzer auf die Aktualisierungsschaltfläche klickt.

Wie sich die verschiedenen Browser (Internet Explorer, Edge, Safari, FireFox, Chrome) mit verschiedenen Caching-Anweisungen (Etag, zuletzt geändert, must-revalidate, verfällt, max-age, no-cache, no-store) verhalten, können Sie unter lesen https://gertjans.home.xs4all.nl/javascript/cache-control.html

0
Gert-Jan

Ich weiß, dass diese Frage alt ist, aber trotzdem ... Ich habe bemerkt, dass Chrome sich an die letzte Aktualisierung erinnert, die Sie gemacht haben. Wenn Sie also Strg + Umschalt + R drücken (Cache aktualisieren und löschen) und Strg + R (nur Aktualisieren) drücken, löscht Chrome weiterhin den Cache und zeigt 304 nicht in der erhaltenen Antwort an. Hierfür gibt es eine Problemumgehung. Drücken Sie Strg + Umschalttaste + r und gehen Sie zur Adressleiste, fokussieren Sie sie und drücken Sie die Eingabetaste. Wenn Ihre etags richtig eingestellt sind und Ihr Server einen 304 bereitstellen kann, wird im Debugger ein neuer Antwortcode angezeigt - 304. Das funktioniert also.

0
M K