2012-04-14 7 views
2

Ich habe eine Webanwendung, die ein paar hundert kleine Bilder enthält und unter Last ziemlich schlecht funktioniert.Chrome & Expires Header - Image Caching

Um dies zu bekämpfen, möchte ich statische Dateien im Browser zwischenspeichern.

eine servlet filter on Tomcat 7 Verwendung, habe ich nun die Header korrekt auf statische Dateien abläuft, und sehen, dass dies zu Chrome zurückgegeben:

Accept-Ranges:bytes 
Cache-Control:max-age=3600 
Content-Length:40284 
Content-Type:text/css 
Date:Sat, 14 Apr 2012 09:37:04 GMT 
ETag:W/"40284-1333964814000" 
**Expires:Sat, 14 Apr 2012 10:37:05 GMT** 
Last-Modified:Mon, 09 Apr 2012 09:46:54 GMT 
Server:Apache-Coyote/1.1 

aber ich merke, dass Chrome noch eine Rundfahrt auf der tut Server für jede statische Ressource beim Neuladen, Senden einer if-modifizierten Kopfzeile und Abrufen einer korrekten 304 Not Modified-Antwort von Tomcat.

Gibt es eine Möglichkeit, Chrome dazu zu bringen, diese 100+ Anfragen an den Server zu vermeiden, bis der Ablauf wirklich abgelaufen ist?

+0

Ändern sich diese Bilder ständig oder bleiben die meisten gleich? – abraham

+0

Eine ähnliche Frage wurde gestellt: [Chrome - warum sendet es wenn-modifiziert-seit Anfragen?] (Http://stackoverflow.com/questions/3934413/chrome-why-is-it-sending-if-modified- Seit-Anfragen). Nicht sicher, dass es tatsächlich beantwortet wurde, aber es gibt ein paar Ideen dort ... – kevinjansz

Antwort

2

Seien Sie vorsichtig, wenn Sie testen. Ich habe festgestellt, dass ich in Chrome Version 20, wenn ich F5 drücke, um die Seite neu zu laden, dann im Netzwerkbereich neue Anfragen sehe. Hoewer, wenn ich den Cursor auf die Titelleiste setzen, nach der aktuellen Seite URL, und drücken Sie die Eingabetaste, ich bekomme Ressourcen aus dem Cache, die Header wurde auf Cache festgelegt.

Auch eine gute Lektüre:

http://betterexplained.com/articles/how-to-optimize-your-site-with-http-caching/

9

Es gibt 3 Möglichkeiten, das Laden einer Seite -

  1. die URL in der Adressleiste Putting und die Eingabetaste drücken, die von äquivalent zu navigieren eine Hyper-Verbindung (Standard-Browsing-Verhalten). Dies berücksichtigt die Expires-Header und prüft zunächst, ob der Cache des statischen Inhalts gültig ist. Wenn die Header-Zeit des Expires in der Zukunft liegt, wird sie direkt aus dem Cache geladen. In diesem Fall wird der Browser keine Anfrage an den Server stellen. Falls der zwischengespeicherte Inhalt ungültig ist, wird eine Anfrage an den Server gestellt.

  2. Drücken Sie f5, um die Seite zu aktualisieren. Dies würde im Grunde eine wenn-modifizierte Kopfzeile an den Server senden und überprüfen, ob sich der Inhalt geändert hat. Wenn es sich geändert hat, erhalten Sie eine Antwort von 200, andernfalls eine 304-Antwort. In beiden Fällen wird das Bild nicht auf die Seite geladen, bis eine Antwort vom Server empfangen wird.

  3. Durch Drücken von Strg + F5 wird der gesamte Cache zwangsweise gelöscht und alle Bilder neu geladen. Es wird keine Zeit damit verbringen, zu überprüfen, ob sich die Bilder geändert haben oder nicht.

Ich denke, das Verhalten, das Sie erwarten, sind die erste Art ist. Die einzige Sache, die Sie betrachten sollten, ist die Art, wie Sie die Seite laden. Normalerweise werden die Leute nicht auf f5 oder ctrl + f5 drücken, so dass Ihr statischer Inhalt nicht jedes Mal erneut überprüft wird. Es wird den Cache zwangsweise löschen und jedes statische Element auf der Seite neu laden.

Kurz gesagt, vergessen Sie nicht, die Seite neu zu laden, indem Sie in der Adresszeile die Eingabetaste drücken. Der Browser berücksichtigt die von Ihnen angegebenen Header. Dies ist nicht spezifisch für Chrom, es ist ein W3C-Standard.

0

Angenommen, Sie haben die verschiedenen bereits vorgeschlagenen Fehler ausgeschlossen, habe ich festgestellt, dass Google Chrome die Cache-Control-Direktive ignorieren kann, sofern sie nicht public enthält und dass dies der erste sein muss.Zum Beispiel:

Cache-Control: public, max-age=3600 

Bei meinen Versuchen auch entfernte ich ETags von der Server-Antwort, so dass ein Faktor sein könnte, aber ich habe nicht zurück und überprüfen gehen.