2012-12-07 26 views
2

目前,我們正在使用的方法胸圍瀏覽器緩存的資源,如CSS和JS類似SE的方式:https://meta.stackexchange.com/questions/112182/how-does-se-determine-the-css-and-js-version-parameter什麼時候是基於文件名的瀏覽器cachebusting實際需要?

不管怎麼說,做一些測試與HTTP標頭後,我不知道什麼時候這實際上是必要。這僅僅是從90年代遺留下來的遺留物,還是存在無法讀取Last-Modified或ETags HTTP標頭的現代瀏覽器?

+4

當您的數據被推送到CDN時它確實派上用場,並且在數據更改時很難使大型分佈式緩存無效。 –

+1

這比Josh的+1 –

+1

答案要好得多,我發現它對付CloudFlare最有用。 –

回答

3

緩存問題

當您試圖服務器JS或CSS是揮發性的,你不想/不能(例如使用CDN)依賴於HTTP緩存指令頭,使瀏覽器請求新文件。一些較舊的瀏覽器不響應HTTP緩存指令;所以如果你瞄準他們,你的選擇有限。在舊版瀏覽器中,某些代理服務器會剝離或無效或忽略代理信息,因爲它們有問題,或者它們充當積極的緩存。因此,使用HTTP緩存控制標頭將不起作用。在這種情況下,您只需確保最終用戶在碰到F5之前不會獲得奇怪的功能。

揮發性JS/CSS資源可能來自文件/文件是可編輯通過管理/配置面板資源。其中一些原因是主題化,佈局編輯或用於國際化的語言定義文件。

HTTP 1.0

有遺留系統,在那裏,使用它。考慮Oracle的RDBMS解決方案中內置的HTTP服務器(EGP網關)仍然使用它。一些代理將1.1請求轉換爲1.0。古代瀏覽器仍然只支持1.0,但現在這應該是一個相對不重要的問題。

無論如何,HTTP 1.0使用一組不同的相比HTTP 1.1的產品,它是「原始」的控制機制。它們包括很多啓發式測試,RFC中沒有指定讓緩存合理運行。在任何一種情況下,高速緩存通常會導致奇怪的行爲,因爲陳舊的內容被傳遞或者相同的內容是請求而沒有改變。

上附註的說明:上的請求沒有迴應無緩存只有

作品;人們不知道的常見事物。這是爲了防止中間系統緩存敏感信息。它仍然在HTTP 1.1中有後向支持,但不應該使用,因爲它已被棄用。

...除非微軟稱IE沒有做到這一點:http://support.microsoft.com/kb/234067

輸入對於生成內容

另一個原因是JS或CSS是基於輸入參數生成。僅僅因爲URL包含somefile.js並不意味着需要成爲文件系統上的真實文件。它可能只是從一個進程輸出的JS。如果該過程需要根據參數輸出不同的內容,則GET參數是實現此目的的好方法。

考慮頁面版本控制。在大型應用程序中,頁面可能因歷史或業務需求而保留,它允許存在相同的命名資源,但是如果需要特定版本,則可以根據需要提供。您可以將每個版本保存在不同的文件中,或者您可以創建一個流程,輸出正確的內容並進行正確的版本更改。

舊瀏覽器問題

在IE6,AJAX請求將受到瀏覽器的緩存。如果您要求的服務無法控制,而且網址沒有改變,那麼在URL中添加一個簡單的隨機字符串就可以避免這個問題。

瀏覽器緩存選項

如果我們考慮HTTP 1.1的RFC爲user agent cache settings我們也看到了這一點:

許多用戶代理有可能使用戶覆蓋基本 緩存機制。例如,用戶代理可能允許用戶 指定高速緩存的實體(即使是明顯過時的實體)未被驗證的 。或者用戶代理可能會習慣性地向每個請求添加「Cache- Control:max-stale = 3600」。用戶代理應該不是 默認爲非透明行爲或導致 異常無效高速緩存的行爲,但可以明確配置 以通過用戶的明確操作來完成。

改變對資源的版本的URL可以考慮對策這樣的問題。無論你相信這是值得的,我會留給讀者。

結論

有理由GET參數添加到文件的要求,但實際上要做到這一點,現在(寫爲2012年)的唯一理由是爲動態生成的腳本和解決問題提供輸入參數您無法控制緩存標頭。

就我個人而言,我僅用於爲動態輸出初始化腳本的腳本提供輸入參數,但像開發中的所有內容一樣,總會有一些邊緣情況增加了原因。

+0

找到不尊重緩存的瀏覽器列表(http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers) Internet Explorer版本6-8; FireFox版本1.5 - 3.0; Safari版本3; 歌劇9; –

相關問題