對(duì)于動(dòng)態(tài)文件,比如 index.asp?id=... 或者 index.aspx?id=... 相信有經(jīng)驗(yàn)的程序員都知道怎樣禁止瀏覽器緩存數(shù)據(jù)了. 但是對(duì)于靜態(tài)文件(css,jpg,gif等等), 在什么場(chǎng)合下面我們需要禁止瀏覽器緩存他們,怎么做?
本文討論的主題是如何防緩存, 尤其是如何防止靜態(tài)文件被緩存..
在 RE:對(duì)博客園URL的一些調(diào)整建議, 二級(jí)域名不利于客戶端瀏覽器緩存 一文中,我提到了怎么最大化的 利用瀏覽器緩存功能,來(lái)提高客戶端瀏覽速度, 減輕服務(wù)器負(fù)擔(dān)的.
但是事物總是一分為二的,并不是所有的場(chǎng)合都要使用緩存的. 有時(shí)候我們的數(shù)據(jù)被緩存了反而會(huì)給我們帶來(lái)麻煩.
對(duì)于動(dòng)態(tài)數(shù)據(jù)(從數(shù)據(jù)庫(kù)讀取生成的那些),我們可以通過以下方法來(lái)禁止瀏覽器緩存。
‘a(chǎn)sp 為例 禁止緩存
Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" Response.AddHeader "Pragma", "No-Cache" 對(duì)于Ajax 的請(qǐng)求(不管是靜態(tài)數(shù)據(jù)還是動(dòng)態(tài)數(shù)據(jù)):
//以下三種方法使用其中任何一種方法都可以 xmlhttp.setRequestHeader("Cache-Control","no-cache"); //或者 xmlhttp.setRequestHeader("If-Modified-Since","0"); //或者 xmlhttp.Open(url+‘?rnd=‘+Math.random(),....)
如果使用 prototype.js , 用類似這樣的代碼 new Ajax.Request(url,{method:"get",requestHeaders:["Cache-Control","no-cache"]}) 或者 new Ajax.Request(url,{method:"get",requestHeaders:["If-Modified-Since","0"]})
什么情況下,要禁止靜態(tài)文件緩存: 1、經(jīng)??赡芤膭?dòng)的 js, css. 比如 一個(gè)html 文件, test.html 在 1.0版本中??赡苁沁@樣 <script src="common.js"></script> 修改后 v1.1版本: <script src="common.js"></script> <script src="foo.js"></script> 新增加了一個(gè)foo.js 同時(shí),也改動(dòng)了common.js , 在common.js 中定義了新的類,并在foo.js 中使用了common.js.
在這種情況下如果以前用戶瀏覽過 1.0版本的 html 文件,那么他的瀏覽器自動(dòng)緩存了 common.js 當(dāng)他瀏覽新版本的時(shí)候,因?yàn)槭褂玫氖?nbsp; v1.1的 foo.js 和 v1.0的 common.js ,這樣將導(dǎo)致腳本出錯(cuò)。
解決方法探討: 因?yàn)閏ss,js 是通過 <script src=....> 這種方式加載的,所以,很難使用 asp 的那種服務(wù)器端禁止緩存的辦法。也很難使用ajax的通過設(shè)置 http請(qǐng)求頭的辦法禁止使用緩存。
看來(lái)隨機(jī)數(shù)是個(gè)好辦法。
//方法一: document.write("<script src=‘test.js?rnd="+Math.random()+"‘></s"+"cript>")
//方法二: var js=document.createElement("script") js.src="test.js"+Math.random() document.body.appendChild(js)
但是,如果采用隨機(jī)數(shù)的話, js文件將永遠(yuǎn)得不到緩存,每次都必須重新從服務(wù)器加載,即使沒有任何更改。 大家如果經(jīng)常上國(guó)外網(wǎng)站的話,可以看到他們通常采用這樣的方式來(lái)解決: <script src="test.js?ver=113"></script> 其中 ver=113 的 113就是版本號(hào),一般都是采用 CVS 或其他工具生成的開發(fā)版本號(hào)。
這樣真正做到了應(yīng)該緩存的時(shí)候緩存靜態(tài)文件,當(dāng)版本有更新的時(shí)候從獲取最新的版本,并更新緩存。 對(duì)于圖像 <img src="test.jps?ver=在CVS的版本號(hào)"> 來(lái)有效利用和更新緩存.
唉,現(xiàn)在在CSDN的Web版,不知道有多少人在重復(fù)問著同一個(gè)問題。“怎么通過程序刪除清空客戶端的瀏覽器緩存”.........
|