2012-04-14 44 views
2

我有一個包含幾百個小圖像的web應用程序,並且在加載時表現相當糟糕。Chrome和過期頭 - 圖像緩存

爲了解決這個問題,我想在瀏覽器中緩存靜態文件。

使用servlet filter on Tomcat 7,我現在設定的靜態文件正確Expires頭,並且可以看到,這是返回到Chrome瀏覽器:

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 

然而,我注意到,Chrome仍然會做一個往返於服務器上重新加載每個靜態資源,發送一個if-modified頭並從Tomcat獲得正確的304 Not Modified響應。

有沒有什麼辦法讓Chrome在服務器到期之前避免這100多個請求?

+0

這些圖像是不斷變化還是大部分保持不變? – abraham 2012-04-15 00:06:55

+0

一個類似的問題已經被問到:[Chrome - 爲什麼它發送如果修改,因爲請求?](http://stackoverflow.com/questions/3934413/chrome-why-is-it-sending-if-modified-因爲-請求)。不確定它實際上是否回答,但有一些想法在那裏... – kevinjansz 2012-04-15 23:07:50

回答

2

當您測試時請小心。我注意到,在Chrome版本20中,如果我點擊F5重新加載頁面,那麼在網絡面板中,我會看到新的請求。 如果我將光標放在標題欄上,在當前頁面的url之後,並按下回車鍵,我會從緩存中獲取資源,並將標題設置爲緩存。

也是一個很好的閱讀:

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

9

有加載頁面的3種方式 -

  1. 把在地址欄中的URL並按下Enter鍵即相當於從導航超鏈接(默認瀏覽行爲)。這將遵守Expires標題,並首先檢查靜態內容的緩存是否有效,然後如果Expires標題時間將來會直接從緩存中加載它。在這種情況下,瀏覽器根本不會向服務器發出任何請求。如果緩存的內容無效,它將向服務器發出請求。

  2. 按f5刷新頁面。這基本上會將一個if-modified頭部發送到服務器,並驗證內容是否已更改。如果它已經改變,你會得到一個200響應,否則,如果不是,那麼304響應。在這兩種情況下,在從服務器收到響應之前,圖像不會加載到頁面上。

  3. 按ctrl + f5將強制清除所有緩存並重新載入所有圖像。它不會花時間檢驗圖像是否已經改變或者沒有使用標題。

我猜你所期望的行爲是第一種。你應該關注的唯一事情就是你加載頁面的方式。通常人們不會按f5或ctrl + f5,因此您的靜態內容不會每次都重新驗證。它將強制清除緩存並重新加載頁面上的每個靜態項目。

總之只要記住 - 在地址欄中按Enter鍵重新加載頁面。瀏覽器將遵循您提供的標題。這不是針對Chrome,它是W3C標準。

0

假設您排除了已經提出的各種疑難問題,我發現Google Chrome可以忽略Cache-Control指令,除非它包含public,並且它必須是第一個。例如:

Cache-Control: public, max-age=3600 

在我的實驗我也刪除的ETag來自服務器的響應,這樣可能是一個因素,但我沒有回去檢查。