本文**:本文介紹瀏覽器和web伺服器之間如何處理"瀏覽器快取",以及控制快取的http header.
本文會使用fiddler來檢視http request和response, 如果不熟悉這工具,可以先參考[fiddler教程] 。在看本文的時候, 請務必開啟fiddler來實踐。
閱讀目錄
快取的概念
快取的好處
fiddler可以方便地檢視快取的header
如何判斷快取新鮮度
通過最後修改時間,判斷快取新鮮度
與快取相關的header
etag
瀏覽器不使用快取
直接使用快取,不去伺服器端驗證
如何設定ie不使用快取
公有快取和私有快取的區別
快取這個東西真的是無處不在, 有瀏覽器端的快取, 有伺服器端的快取,有**伺服器的快取, 有asp.net頁面快取,物件快取。 資料庫也有快取, 等等。
http中具有快取功能的是瀏覽器快取,以及快取**伺服器。
http快取的是指:當web請求抵達快取時, 如果本地有「已快取的」副本,就可以從本地儲存裝置而不是從原始伺服器中提取這個文件。
快取的好處是顯而易見的, 好處有,
1. 減少了冗餘的資料傳輸,節省了網費。
2. 減少了伺服器的負擔, 大大提高了**的效能
3. 加快了客戶端載入網頁的速度
fiddler中把header都分門別類的放在一起,這樣方便檢視。
web伺服器通過2種方式來判斷瀏覽器快取是否是最新的。
第一種, 瀏覽器把快取檔案的最後修改時間通過 header 」if-modified-since「來告訴web伺服器。
第二種, 瀏覽器把快取檔案的etag, 通過header "if-none-match", 來告訴web伺服器。
1. 瀏覽器客戶端想請求乙個文件, 首先檢查本地快取,發現存在這個文件的快取, 獲取快取中文件的最後修改時間,通過: if-modified-since, 傳送request給web伺服器。
2. web伺服器收到request,將伺服器的文件修改時間(last-modified): 跟request header 中的,if-modified-since相比較, 如果時間是一樣的, 說明快取還是最新的, web伺服器將傳送304 not modified給瀏覽器客戶端, 告訴客戶端直接使用快取裡的版本。如下圖。
3. 假如該文件已經被更新了。web伺服器將傳送該文件的最新版本給瀏覽器客戶端, 如下圖。
例項: 開啟fiddler, 然後開啟首頁。然後f5重新整理幾次瀏覽器。 你會看到首頁也用了快取。
我們來看看每個header的具體含義。
request
cache-control: max-age=0
以秒為單位
if-modified-since: mon, 19 nov 2012 08:38:01 gmt
快取檔案的最後修改時間。
if-none-match: "0693f67a67cc1:0"
快取檔案的etag值
cache-control: no-cache
不使用快取
pragma: no-cache
不使用快取
response
cache-control: public
響應被快取,並且在多使用者間共享, (公有快取和私有快取的區別,請看另一節)
cache-control: private
響應只能作為私有快取,不能在使用者之間共享
cache-control:no-cache
提醒瀏覽器要從伺服器提取文件進行驗證
cache-control:no-store
絕對禁止快取(用於機密,敏感檔案)
cache-control: max-age=60
60秒之後快取過期(相對時間)
date: mon, 19 nov 2012 08:39:00 gmt
當前response傳送的時間
expires: mon, 19 nov 2012 08:40:01 gmt
快取過期的時間(絕對時間)
last-modified: mon, 19 nov 2012 08:38:01 gmt
伺服器端檔案的最後修改時間
etag: "20b1add7ec1cd1:0"
伺服器端檔案的etag值
如果同時存在cache-control和expires怎麼辦呢?
瀏覽器總是優先使用cache-control,如果沒有cache-control才考慮expires
etag是實體標籤(entity tag)的縮寫, 根據實體內容生成的一段hash字串(類似於md5或者sha1之後的結果),可以標識資源的狀態。 當資源傳送改變時,etag也隨之發生變化。
etag是web服務端產生的,然後發給瀏覽器客戶端。瀏覽器客戶端是不用關心etag是如何產生的。
為什麼使用etag呢? 主要是為了解決last-modified 無法解決的一些問題。
1. 某些伺服器不能精確得到檔案的最後修改時間, 這樣就無法通過最後修改時間來判斷檔案是否更新了。
2. 某些檔案的修改非常頻繁,在秒以下的時間內進行修改. last-modified只能精確到秒。
3. 一些檔案的最後修改時間改變了,但是內容並未改變。 我們不希望客戶端認為這個檔案修改了。
例項, 開啟fiddler, 開啟首頁。 你可以看到很多,或者css檔案都是用了快取。 這些都是通過比較etag的值,來判斷檔案是否更新了。
ctrl+f5強制重新整理瀏覽器,或者設定ie。 可以讓瀏覽器不使用快取。
1. 瀏覽器傳送http request, 給web 伺服器, header中帶有cache-control: no-cache. 明確告訴web伺服器,客戶端不使用快取。
2. web伺服器將把最新的文件傳送給瀏覽器客戶端.
例項:開啟fiddler, 開啟首頁, 然後按ctrl+f5強制重新整理瀏覽器,你將看到
pragma: no-cache的作用和cache-control: no-cache一模一樣。 都是不使用快取。
pragma: no-cache 是http 1.0中定義的, 所以為了相容http 1.0. 所以會同時使用pragma: no-cache和cache-control: no-cache
按f5重新整理瀏覽器, 瀏覽器會去web伺服器驗證快取。
例項: 比較第一次訪問主頁和第二次主頁
1. 啟動fiddler, 用firefox開啟主頁, 發現有50多個session。
2. 按ctrl+x將fiddler中的所有session刪除。 關閉firefox,重新開啟乙個firefox,開啟主頁。 發現只有30多個session.
分析; 少了的session是因為firefox直接用了快取,而沒有發http request。
開啟ie。點選工具欄上的, 工具->internet選項->常規->瀏覽歷史記錄 設定. 選擇「從不」。然後儲存。
然後點選「刪除」 把internet臨時檔案都刪掉 (ie快取的檔案就是internet臨時檔案)。
cache-control: public 指可以公有快取, 可以是數千名使用者共享的。
cache-control: private 指只支援私有快取, 私有快取是單個使用者專用的。
http協議之快取
http協議快取控制 第一次請求時200 ok 第二次請求304 not modified 為修改狀態 解釋 在網路上有一些快取伺服器,另外瀏覽器自身也有快取功能。基於乙個前提 不會經常改動,伺服器在返回200的時候,還返回該的 簽名 etag 簽名可以理解為的 指紋 當瀏覽器再次訪問該時,去伺服器...
HTTP 協議快取機制
瀏覽器 http 協議快取機制詳解 收藏 xrzs 破譯 粽 子 拿最高懸賞!最近在準備優化日誌請求時遇到了一些令人疑惑的問題,比如為什麼響應頭里出現了兩個 cache control 為什麼明明設定了 no cache 卻還是發請求,為什麼多次訪問時有時請求裡帶了 etag,有時又沒有帶?等等。後...
HTTP協議的快取
http的快取主要是通過請求和相應報文頭部的幾個欄位來控制快取的。也就是cache control後面的字段 快取未更改的資源 etag頭的乙個典型用例是快取未更改的資源。如果使用者再次訪問給定的url 設有etag欄位 顯示資源過期了且不可用,客戶端就傳送值為etag的if none matchh...