2008-09-17 25 views
14

想要瀏覽器緩存資源(JavaScript,CSS,圖像等),直到有新版本可用,然後確保瀏覽器提取並緩存新版本,這是很常見的。它是瀏覽器緩存中用作鍵的文件名或整個URL?

一種解決方案是在資源的文件名中嵌入一個版本號,但是將這樣管理的資源放在一個帶修訂號的目錄中是否做同樣的事情?文件的整個URL是用作瀏覽器緩存中的密鑰還是僅僅是文件名本身和一些元數據?

如果從獲取/r20/example.js/r21/example.js我的代碼的變化,我可以肯定的是修訂example.js 20被緩存,但現在修訂21已經不是獲取它,這就是緩存?

回答

33

是的,在任何改變URL的任何部分(不包括HTTP和HTTPS協議的變化)被解釋爲由瀏覽器(和任何中間代理服務器)建立不同的資源,並且因此將導致在一個單獨的實體瀏覽器的緩存。

更新:

this ThinkVitamin article有人聲稱,Opera和Safari/WebKit瀏覽器不查詢緩存的URL =字符串是

向URL添加版本號參數是執行緩存清除的完全可接受的方式。

ThinkVitamin文章的作者可能會困惑的事實是,在Safari和Opera中的地址/位置欄中按Enter鍵會導致查詢字符串在其中存在不同行爲。

但是,Opera和Safari 表現就像IE和Firefox當涉及到高速緩存,嵌入式/鏈接的圖像和樣式表和腳本的網頁(,這是最重要的組成部分!) - 不管他們是否有「?」字符在他們的URL。 (這可以用一個標準的Apache服務器上的一個簡單的測試來驗證。)

(我會在目前接受的答案評論說,如果我有信譽做。:-)

-1

取決於。它應該是完整的URL,但是一些瀏覽器(Opera,Safari 2)對不同的參數使用不同的緩存策略。

最好的辦法是改變文件名稱

這裏有一個非常聰明的解決方案(使用PHP,Apache)的

http://verens.com/archives/2008/04/09/javascript-cache-problem-solved/

戰略說明: 「根據HTTP緩存規格的信,用戶代理應以查詢從不緩存網址字符串。雖然Internet Explorer和Firefox忽略這一點,Opera和Safari不 - 要確保所有的用戶代理可以緩存你的資源,我們需要不斷的查詢字符串了他們的網址「

http://www.thinkvitamin.com/features/webapps/serving-javascript-fast

+3

ThinkVitamin.com的文章是錯誤的。 Safari和Opera **可以像使用任何網址一樣緩存具有查詢字符串的網址。 ([見我的答案](http://stackoverflow.com/questions/83990/is-it-the-filename-or-the-whole-url-used-as-a-key-in-browser-caches/85386 #85386)以獲取更多信息) – 2011-03-19 22:32:28

+0

除了瀏覽器之外,一些流行的代理還需要更改文件名以打破緩存。 http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/在這篇文章中提到了Squid代理服務器(它確實改變了它在2.7版中的默認設置)我想更寧可玩它安全並更改文件名。 – scunliffe 2011-03-20 00:19:58

2

我99.99999。 %確定它是用於在瀏覽器中緩存資源的整個url,所以你的url方案應該可以正常工作。

0

是的。從緩存角度來看,不同的路徑是相同的。

0

當然,它必須使用整個路徑'/r20/example.js'vs'/r21/example.js'可能是完全不同的圖像開始。你提出的是一種處理版本控制的可行方法。

0

在大多數瀏覽器中使用完整的url。 在某些瀏覽器中,如果您在url中有查詢,則文檔將永遠不會被緩存。

0

他們最低限度您需要標識一個HTTP對象是由完整路徑,包括任何查詢字符串參數。某些瀏覽器可能不會使用查詢字符串緩存對象,但與緩存的密鑰無關。

重要的是要記住,路徑不再足夠。將各不相同:頭中的HTTP響應警報什麼比這應該被用來確定緩存鍵,如餅乾,編碼值的URL以外的瀏覽器(或代理服務器等),等等。

要將基本問題,是的,更改.js文件的URL是足夠的。對於決定緩存鍵的更大問題,它是URL加上Vary:頭限制。

0

整個網址。在一些大小寫敏感的老瀏覽器中,我看到了一種奇怪的行爲。

1

瀏覽器緩存的關鍵是請求方法和資源URI的組合。 URI由方案,權限,路徑,查詢和片段組成。

HTTP 1.1 specification相關摘錄:

主高速緩存鍵由請求方法和目標URI。然而,由於目前常用的HTTP緩存通常限制爲 以緩存對GET的響應,所以許多緩存簡單地拒絕其他方法 並且僅使用該URI作爲主緩存密鑰。

相關摘自URI specification

通用URI語法由稱爲方案,授權,路徑,查詢和 片段 分量的層次序列。

URI   = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 

hier-part = "//" authority path-abempty 
      /path-absolute 
      /path-rootless 
      /path-empty