HTTP協議學習 (五)快取

2022-06-10 20:27:08 字數 4316 閱讀 3484

本文**:
本文介紹瀏覽器和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...