當(dāng)你建立好一個WEB服務(wù)后,通常有兩個類型的緩存需要配置:

  1. 設(shè)置網(wǎng)站有更新的時候html資源馬上過期,以便正在瀏覽的用戶可以很快地得到更新.
  2. 設(shè)置所有其它資源(例如圖片,CSS,javascript腳本)在一定時間后過期.


這個緩存方案涵蓋Two Simple Rules for HTTP Caching文章中提到關(guān)于如何處理更新的一些思想.

現(xiàn)在HttpWatch 6.0支持Firefox了,我們想探討一下Firefox在處理緩存上與IE有些什么不同.設(shè)置較長過期時間的使用方式(上面第二條)仍可以直接用于Firefox,但配置1在兩者之間還是存在細(xì)微差別的.

之前的文章 中,我們把第一條劃分為:

  • 某些時候動態(tài)HTML頁面需要即時從服務(wù)器更新以備隨時顯示-甚至是使用后退按鈕的時候.例如,顯示銀行帳號的狀態(tài)或在線訂單.
  • 靜態(tài)HTML頁面,比如聯(lián)系,FAQs或者站點地圖等頁面,如果它們設(shè)置了Last-Modified響應(yīng)頭,允許瀏覽器在需要的時候重新校驗,就可以利用到緩存.

一:火狐機(jī)制

本文剩下部分探討了Firefox中影響HTML頁面緩存的兩個重要不同點.

1. 使用no-cache防止Firefox緩存無效

你可以簡單地設(shè)置如下的響應(yīng)頭預(yù)防IE緩存任何東西:

Cache-Control: no-cache

使用了這個響應(yīng)頭的頁面不會保存在緩存里,IE總會重新從服務(wù)器加載;即使你使用后退按鈕.下面這個例子使用HttpWatch監(jiān)聽一個網(wǎng)上商店,當(dāng)我們在提交訂單表單后點擊后退按鈕,結(jié)果如下圖:

然而,這個響應(yīng)頭卻不能防止Firefox的緩存.這意味著,Firefox在正常訪問的情況下,將一直使用緩存的頁面,直到它發(fā)送GET請求重新檢驗.并且,如果是通過后退按鈕訪問頁面,Firefox不會再次訪問服務(wù)器,而是簡單直接地從緩存加載.

那怎樣才能關(guān)掉Firefox中的緩存呢? 答案很簡單,關(guān)不了. 因為Firefox依靠緩存中的副本為"文件->另存為","查看源代碼"這樣的操作服務(wù).但是,你可以控制頁面緩存到哪里及那些緩存條目可以用于顯示.

下面響應(yīng)頭在Firefox中可以防止持久化的緩存,強(qiáng)制頁面被緩存到內(nèi)存中:

Cache-Control:no-store

這個頭也可以防止使用后退按鈕時訪問了緩存頁面,它將觸發(fā)一個HTTP GET請求.

這兩個響應(yīng)頭的值組合使用可以在IE與Firefox得到期待的結(jié)果:

Cache-Control: no-cache, no-store

如下HttpWatch響應(yīng)頭標(biāo)簽所示:

no-store and no-cache headers

2. 如果沒有設(shè)置過期時間Firefox會為你設(shè)置一個

當(dāng)IE遇到?jīng)]有Expires頭的http響應(yīng)時,它就認(rèn)為永遠(yuǎn)不能自動使用緩存條目,直到它重新從服務(wù)校驗.由于IE的臨時文件的一個設(shè)置項"檢查所在網(wǎng)頁的較新版本"默認(rèn)為"自動",所以通常都是一個會話做一次.

這就為控制靜態(tài)的html內(nèi)容的緩存提供了一個合理的方式.用戶新打開的IE會得到html的最新版本,而緩存的版本就在關(guān)閉IE前會一直被使用.

Firefox處理缺失Expires頭的方式不同.如果影響中有Last-Modified頭它就會使用HTTP 1.1規(guī)范RFC2616中指定的一個嘗試性的過期值:

(引用規(guī)范:)
并且,如果響應(yīng)中有Last-Modif
ied時間值,嘗試性的過期值不能超過這個值到現(xiàn)在時間間隔的一個比率,一般設(shè)置這個比率為10%.

計算方式如下:(默認(rèn)過期時間)

過期時間 = 現(xiàn)在時間 + 0.1 * (Last-Modified到現(xiàn)在的時間差)

例如,如果你的靜態(tài)HTML文件上次修改時間是100天前,那過期時間就是10天之后.下面的示例是一個沒有Expires頭頁面的HttpWatch緩存標(biāo)簽:

Firefox自動設(shè)置了過期時間為8天后,因為這個頁面大概80天沒有被修改過了.

這意味著,為了保持控制好你的HTML頁面,正如我們在 Two Simple Rules for HTTP Caching 文章中討論過的,你最好為你的靜態(tài)資源如HTML,圖片,CSS文件等,在你的WEB服務(wù)器設(shè)置一個合適的Expires值.

結(jié)論

為了確保IE與Firefox的緩存行為一致,你應(yīng)該:

  • 總是指定一個Expires頭. 一般設(shè)置-1使用html頁面能即時刷新或者對其它如圖片,CSS,javascript腳本資源設(shè)置一個特定的過期時間
  • 如果你要強(qiáng)制頁面刷新,甚至是點擊后臺按鈕的時候,那就設(shè)置 Cache-Control: no-cache, no-store
----------------------------------
二:IE機(jī)制

1:每次都會到服務(wù)器檢查最后一次修改時間是否變化 無變化返回304
2:IE啟動時檢查
3:自動檢查
      3.1:根據(jù)IE的默認(rèn)在瀏覽器不關(guān)閉時,再次訪問同一鏈接都讀本地cache
      3.2:IE重啟時候會根據(jù)服務(wù)器設(shè)置的expire值去判斷是否去服務(wù)器請求判斷,無變化返回304
4:第一次下載后從不檢查
最好的機(jī)制是 3 。根據(jù)服務(wù)器的設(shè)定機(jī)制走,會提高訪問速度。
提高訪問速度,最好的辦法就是減少TCP通信。

-------------------------
三:服務(wù)器的設(shè)置
參考:http://hi.baidu.com/%C8%FD%BE%D6%CE%AA%B6%FE/blog/item/30dae1325363ed92a8018e5c.html

-------------------------
四:服務(wù)端設(shè)置和客戶端的關(guān)聯(lián)
服務(wù)器的設(shè)置告知瀏覽器怎么做緩存,緩存時間是多長。客戶端同時也可以是CDN。

-------------------------
五:工具類分析
IE httpwatch ,FF httpfox YSlow firebug