今天和同事在討論瀏覽器的緩存問題。正好之前有遇到過,當時一時沒有想清楚它的緩存機制,所以晚上正好有時間仔細研究了一下。
瀏覽器為什么要緩存?什么會緩存下來?
首先當我們訪問網頁的時候,很多大的圖片從服務器上傳輸過來的時候,試想一下,如果瀏覽器不把圖片緩存下來而是每次都要到服務器去取,那么每次都給服務器和網絡造成了巨大的負擔。
對於靜態資源來說,瀏覽器不會緩存html頁面的,所以你每次改完html的頁面的時候,html都是改完立即生效的,不存在什么有緩存導致頁面不對的問題。瀏覽器緩存的東西有圖片,css和js。這些資源將在緩存失效前調用的時候調用瀏覽器的緩存內容。
怎么讓瀏覽器的緩存的東西不失效?
文檔里有種說法是吧header中的Expires:設置為Sun, 17-Jan-2038 19:14:07 GMT,因為這個時間是32位unix支持的最大的時間值
但是網上有種說法就是IIS6 最大的時間只能到31-Dec-2035
If you’re using IIS6 you’ll find that the UI won’t allow anything beyond 31-Dec-2035.
總之我們把這個時間設置到很大就可以了。下面是訪問google時一個response返回的值。
補充一下,如果expires的時間為-1,那么緩存會立即失效。如果是一個將來時間,那么它將在將來時間失效
怎么讓瀏覽器不緩存靜態資源?
一種方式就是讓你的頁面有這樣的header,Cache-Control: no-cache header,這樣瀏覽器就不會緩存靜態資源了,每次取數據的時候都去服務器上重新獲取。
補充一下,如果設置no-cache的時候對IE是有效的,但是對於firefox是不行的,如果讓firefox也不緩存要在header中加一個Cache-Control: no-cache, no-store
另外一種方式就是讓你的靜態資后綴加上一個版本號,比如
|
1
|
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"../css/icon.css?version=3.1.32(2013-05-31)"
/>
|
如果不設置這些瀏覽器用什么來控制緩存失效?
header中有一個參數叫Last-Modified ,這個是由服務器自動加上的,如果有這個參數,那么瀏覽器每次都會重新計算本地的cache。如果瀏覽器返回一個304的編碼就表示資源沒有改變,那么瀏覽器就可以使用本地的cache。
就如參考文檔中說的,對於IE來說,如果沒有設置expirse header的時候,IE的緩存時間就是一個session的時間,如果用戶打開一個新的IE窗口的時候,他們就會獲取最新的靜態資源。但是對於 firefox來說它就不是這樣了,它是依賴last—modified的時間的(HTTP 1.1 spec RFC2616)。
Also, if the response does have a Last-Modified time, the heuristic expiration value SHOULD be no more than some fraction of the interval since that time. A typical setting of this fraction might be 10%.
也就是說firefox的失效時間=現在時間+0.1*(time-last-modified ),就是他將在它上一次修改時間的十分之一的時間差的時候失效。
為什么這么做呢?我們可以想象一個文件越久沒有修改,那么它就越穩定,所以緩存的時間也就越長。只是這個時間差要除以下10。
比如一個文件上次修改時間為100天之前,那么那10天后才會失效。
參考文檔:http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/
http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/
總結一下,以前對瀏覽器的緩存及失效了解的不是很透徹,具體是如何失效的也不太清楚,那么現在對於如何能改變緩存,永久緩存及合適能失效都有了比較詳細的了解。另外要注意的就是IE和firefox的機制還是有很大區別的。

