1. 程式人生 > >Etag與HTTP快取機制

Etag與HTTP快取機制

Etag - Last-Modified和Etags如何幫助提高效能?

把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 - 作用

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 - 工作原理

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中的快取機制

網頁的快取是由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臨時文章夾留下頁面備份。

header常用指令
header分為三部分:
第一部分為HTTP協議的版本(HTTP-Version);
第二部分為狀態程式碼(Status);
第三部分為原因短語(Reason-Phrase)。 

// fix 404 pages: 用這個header指令來解決URL重寫產生的404 header 
header('HTTP/1.1 200 OK'); 
  
// set 404 header: 頁面沒找到
header('HTTP/1.1 404 Not Found'); 
  
//頁面被永久刪除,可以告訴搜尋引擎更新它們的urls
// set Moved Permanently header (good for redrictions) 
// use with location header 
header('HTTP/1.1 301 Moved Permanently');  

// 訪問受限
header('HTTP/1.1 403 Forbidden');

// 伺服器錯誤
header('HTTP/1.1 500 Internal Server Error');

禁止頁面在IE中快取 

http響應訊息頭部設定:

CacheControl = no-cache
Pragma=no-cache
Expires = -1 

Expires 表示存在時間,允許客戶端在這個時間之前不去檢查(發請求),等同max-age的 
效果。但是如果同時存在,則被Cache-Control的max-age覆蓋。 

HTTP響應優化

1.去掉Date, Expires