2012-03-10 59 views
0

如何使瀏覽器緩存資源(如圖像),並使用命令告訴瀏覽器不要檢查更新的文件?我擁有永遠不會改變的靜態資產,不斷要求服務器進行更新是一種浪費。apache緩存控制無需驗證

回答

1

我的主人不聲明favicon.ico的文件,圖像/ X-圖標,所以我需要以下

AddType image/x-icon .ico 

您設置到期如下,每種類型之一。下面是一個例子集(您可以使用天,周,月等。

ExpiresActive On 
ExpiresByType text/css  "access plus 1 month" 
ExpiresByType text/javascript "access plus 1 month" 
ExpiresByType image/gif  "access plus 1 week" 
ExpiresByType image/png  "access plus 1 week" 
ExpiresByType image/x-icon "access plus 1 week" 

您可能還希望設置緩存頭

<FilesMatch "\.(css|js|gif|jpe?g|png|ico)$"> 
    Header add "Cache-Control" "public, max-age=604800" 
</FilesMatch> 

所需的其他類型的擴展604800 = 1周秒。如果你想改變這個你算算。

瀏覽器如何使用這些頭

RFC 2616 (HTTP/1.1)規定了何時以及如何b的框架建議羅爾斯使用這些信息。要深入瞭解實際情況,請使用Google Chrome開發者視圖(Ctl + Shft + I)網絡標籤。 (儘管可能通過擴展包,但大多數其他主流瀏覽器都提供相同的工具。)但是,這是建議性的,用戶可以選擇忽略此選項,但它們總是選擇檢查服務器,或者每個會話檢查一次服務器。 IIRC,一些早期的瀏覽器(例如MSIE 8)每次會話都有一次檢查作爲默認選項。

此外,如果你選擇做一個刷新頁面,那麼大多數瀏覽器將重新驗證在頁面上使用的所有資源如果-Modified-Since的如果 - 無 - 匹配,所以你需要重新鏈接或重新輸入URI以查看正常重用操作。同樣,大多數人會將Shift +刷新視爲「強制刷新」 - 即不進行協商。

當我管理OpenOffice.orf用戶論壇時,我曾經分析過整個月份的訪問日誌,看看有多少緩存是通過使用簡單的算法來確定何時重用資源應該被緩存,但仍然被客戶端瀏覽器。我驚訝地發現這個緩存未命中率超過了30%(由於用戶的瀏覽器設置)。然而,大多數用戶使用谷歌作爲知識庫訪問這些用戶論壇,詢問具體問題,然後查看幾頁,從不在本月內返回。當我將自己限制在主持人的IP(主要使用Ff或Chrome作爲他們的瀏覽器)時,此速率提高到〜95%。

因此,客戶端瀏覽器使用此信息,但沒有你所期望的那麼多。我還討論了here,當你沒有明確請求這個時,瀏覽器也可以緩存資源。

+0

我知道如何緩存。我想告訴服務器甚至不要檢查更新的版本。 – LordZardeck 2012-03-11 04:41:20

+0

@LordZardeck,你的願望是不合邏輯的。 mod_expires在文件上執行'lstat()'。鑑於這是它將要讀取的文件,這與已經在文件系統緩存中緩存的inode的lstat相當。這花費幾百微秒。如果沒有兌現,讀取本身可能需要100毫秒或更多。您無法使用mod_expires將來設置絕對日期。當然,您可以放下標題並讓瀏覽器執行cond'l GET。解決這個問題! ; - ? – TerryE 2012-03-11 05:13:49

+0

此外,如果你想「服務器甚至不檢查」,然後改變你的問題。你說「告訴*瀏覽器* ...「順便說一句,」訪問加1個月「意味着瀏覽器在重新驗證之前將在下個月使用本地緩存副本。如果您不喜歡,那麼將」access + 10 years「或其他相同的東西放在一起。 – TerryE 2012-03-11 05:18:42