2012-11-11 111 views
4

我存儲和緩存的圖片與鏈接這樣緩存圖像,但更新的變化

http://example.com/1.jpg 
http://example.com/2.jpg 

用戶必須修改和覆蓋1.jpg2.jpg能力。所以我想要緩存所有圖像,但更新剛被覆蓋的圖像文件的緩存。 現在,我使用.htaccess方法緩存

<IfModule mod_expires.c> 
ExpiresActive On 
<FilesMatch "(?i)^.*\.(jpg|jpeg|png)$"> 
ExpiresDefault "access plus 1 year" 
</FilesMatch> 
</IfModule> 

但使用這種方法的圖像仍保持不變,即使用戶覆蓋該文件。

+3

對[條件請求]使用'ETag'標頭(https://en.wikipedia.org/wiki/HTTP_ETag)。 – 2012-11-11 18:08:23

+0

用戶如何訪問這些圖像?通過一個帶有''標籤的HTML頁面?如何生成HTML頁面? – vladr

+0

@ user647772 - 請發表您的建議作爲答案,我會授予賞金;除非明天有人提出更好的答案。 – WEFX

回答

4

未來,ETag s應該沒有進一步的努力服務您的需求。 ETags應該默認工作,所以你並不需要做任何事情,但爲了避免在多服務器環境中出現問題,你可以配置你的ETag,以便根據文件大小和上次修改的時間戳進行計算。例如,在你的.htaccess或Apache配置替換以下行現有的指令:

FileETag MTime Size 

的eTag將有效地「過期」的形象變化的時候,緩存圖像自動。缺點是瀏覽器仍然會對每個請求查詢資源,所以它比您使用的過期指令效率稍低。另一方面,ETags避免了你所描述的問題。

但是,如果您已經按照您的問題所述使用了其中一個緩存指令,並將Expires的值設置爲將來的某個值,那麼任何請求該文件的瀏覽器都不會再檢查它一段時間。你可以通過在URL上附加一個簡單的查詢字符串(如?cache=123)來使其不同(從而繞過緩存)。那麼你將來可以依靠ETag機制。

1

這個問題很可能不在服務器上,而是在瀏覽器上。瀏覽器不檢查服務器是否更改圖像。你所做的並不完全解決這個問題。

以下將告訴瀏覽器始終檢查服務器的更改。

<IfModule mod_headers.c> 
    <FilesMatch "(?i)^.*\.(jpg|jpeg|png)$"> 
    Header set Cache-Control "max-age=0" 
    </FilesMatch> 
</IfModule> 

請注意,訪問這些圖片時,這會讓您的網站變慢。這些文件仍然會被緩存,但瀏覽器將檢查服務器以查看它們是否已更改(If-Modifed-Since)。增加最大年齡(以秒爲單位),以犧牲過時性爲代價來提高性能。

(順便說一句,「最大年齡= 0,必重新驗證」是一個更好的價值,但瀏覽器已經misimplemented規範。必重新驗證可能會在某些瀏覽器和代理禁用緩存。)

參見https://stackoverflow.com/a/1383359/1205867