Etag與HTTP快取機制

2021-09-01 02:14:47 字數 2911 閱讀 6947

把last-modified和etags請求的http報頭一起使用,這樣可利用客戶端(例如瀏覽器)的快取。因為伺服器首先產生last-modified/etag標記,伺服器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該記號傳回伺服器要求伺服器驗證其(客戶端)快取。

過程如下:

1.客戶端請求乙個頁面(a)。

2.伺服器返回頁面a,並在給a加上乙個last-modified/etag。

3.客戶端展現該頁面,並將頁面連同last-modified/etag一起快取。

4.客戶再次請求頁面a,並將上次請求時伺服器返回的last-modified/etag一起傳遞給伺服器。

5.伺服器檢查該last-modified或etag,並判斷出該頁面自上次客戶端請求之後還未被修改,直接返回響應304和乙個空的響應體。

etag 主要為了解決 last-modified 無法解決的一些問題。

1、 一些檔案也許會週期性的更改,但是他的內容並不改變(僅僅改變的修改時間),這個時候我們並不希望客戶端認為這個檔案被修改了,而重新get;

2、某些檔案修改非常頻繁,比如在秒以下的時間內進行修改,(比方說1s內修改了n次),if-modified-since能檢查到的粒度是s級的,這種修改無法判斷(或者說unix記錄mtime只能精確到秒)

3、某些伺服器不能精確的得到檔案的最後修改時間;

為此,http/1.1 引入了 etag(entity tags).etag僅僅是乙個和檔案相關的標記,可以是乙個版本標記,比如說v1.0.0或者說"2e681a-6-5d044840"這麼一串看起來很神秘的編碼。但是http/1.1標準並沒有規定etag的內容是什麼或者說要怎麼實現,唯一規定的是etag需要放在""內。

etag由伺服器端生成,客戶端通過if-match或者說if-none-match這個條件判斷請求來驗證資源是否修改。常見的是使用if-none-match.請求乙個檔案的流程可能如下:

====第一次請求===

1.客戶端發起 http get 請求乙個檔案;

2.伺服器處理請求,返回檔案內容和一堆header,當然包括etag(例如"2e681a-6-5d044840")(假設伺服器支援etag生成和已經開啟了etag).狀態碼200

====第二次請求===

1.客戶端發起 http get 請求乙個檔案,注意這個時候客戶端同時傳送乙個if-none-match頭,這個頭的內容就是第一次請求時伺服器返回的etag:2e681a-6-5d044840

2.伺服器判斷傳送過來的etag和計算出來的etag匹配,因此if-none-match為false,不返回200,返回304,客戶端繼續使用本地快取;

流程很簡單,問題是,如果伺服器又設定了cache-control:max-age和expires呢,怎麼辦?

答案是同時使用,也就是說在完全匹配if-modified-since和if-none-match即檢查完修改時間和etag之後,伺服器才能返回304.

網頁的快取是由http訊息頭中的「cache-control」來控制的,常見的取值有private、no-cache、max-age、must- revalidate等,預設為private。其作用根據不同的重新瀏覽方式分為以下幾種情況:

(1) 開啟新視窗

值為private、no-cache、must-revalidate,那麼開啟新視窗訪問時都會重新訪問伺服器。

而如果指定了max-age值,那麼在此值內的時間裡就不會重新訪問伺服器,例如:

cache-control: max-age=5(表示當訪問此網頁後的5 秒 內再次訪問不會去伺服器)

(2) 在位址列回車

值為private或must-revalidate則只有第一次訪問時會訪問伺服器,以後就不再訪問。

值為no-cache,那麼每次都會訪問。

值為max-age,則在過期之前不會重複訪問。

(3) 按後退按扭

值為private、must-revalidate、max-age,則不會重訪問,

值為no-cache,則每次都重複訪問

(4) 按重新整理按扭

無論為何值,都會重複訪問

cache-control值為「no-cache」時,訪問此頁面不會在internet臨時文章夾留下頁面備份。

// fix 404 pages: 用這個header指令來解決url重寫產生的404 header 

// set 404 header: 頁面沒找到

//頁面被永久刪除,可以告訴搜尋引擎更新它們的urls

// 訪問受限

// 伺服器錯誤

禁止頁面在ie中快取 

http響應訊息頭部設定:

cachecontrol = no-cache

pragma=no-cache

expires = -1 

expires 表示存在時間,允許客戶端在這個時間之前不去檢查(發請求),等同max-age的 

效果。但是如果同時存在,則被cache-control的max-age覆蓋。 

1.去掉date, expires

Etag與HTTP快取機制

etag last modified和etags如何幫助提高效能?把last modified和etags請求的http報頭一起使用,這樣可利用客戶端 例如瀏覽器 的快取。因為伺服器首先產生last modified etag標記,伺服器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該...

Etag與HTTP快取機制

etag last modified和etags如何幫助提高效能?把last modified和etags請求的http報頭一起使用,這樣可利用客戶端 例如瀏覽器 的快取。因為伺服器首先產生last modified etag標記,伺服器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該...

Etag與HTTP快取機制

etag last modified和etags如何幫助提高效能?把last modified和etags請求的http報頭一起使用,這樣可利用客戶端 例如瀏覽器 的快取。因為伺服器首先產生last modified etag標記,伺服器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該...