HTTP Etag與If-None-Match

admin發表於2019-05-07

更多關於HTTP協議的內容可以參閱HTTP 協議一章節。

利用快取可以提高頁面的訪問速度,提高使用者體驗,並且還能夠減輕伺服器壓力。

首先對頁面快取做一下簡單通俗的介紹,要獲取一個頁面需要向伺服器發起一個請求,然後伺服器會產生一個響應,響應內容經過瀏覽器解析之後呈現在我們面前,如果頁面有大量的內容可以重複利用,那麼就可以將這些內容在本地暫時快取起來,當再次訪問該頁面時,就無需從伺服器獲取,直接就近獲取即可。

利用快取優點總結如下:

(1).避免從伺服器再次獲取資源,提高頁面響應速度,進而使用者體驗得到提高。

(2).因為直接從本地獲取,節省頻寬。

(3).減輕了伺服器壓力,也是因為無需伺服器傳送需要的內容。

一.http快取機制:

http快取機制主要在http響應頭中進行設定,相關欄位主要有:

(1).Expires。

(2).Cache-Control。

(3).Last-Modified。

(4).If-Modified-Since。

(5).Etag。

1.Expires:

它是在HTTP1.0協議中定義,用來規定一個時間點,在此時間點之前,瀏覽器可以無需從伺服器獲取資料,直接從本地快取獲得即可;此時間採用GMT格式,並非本地時間。

關於HTTP版本的發展可以參閱HTTP版本發展介紹一章節。

2.Cache-Control:

它是在HTTP1.1協議中定義,相對於Expires更加具體和細緻,所以可以無視Expires欄位的存在。

Cache-Control欄位主要可能的值如下:

(1).max-age:用來設定資源(representations)可以被快取多長時間,單位為秒。

(2).s-maxage:和max-age是一樣的,不過它只針對代理伺服器快取而言。

(3).public:指示響應可被任何快取區快取。

(4).private:只能針對個人使用者,而不能被代理伺服器快取。

(5).no-cache:強制客戶端直接向伺服器傳送請求,也就是說每次請求都必須向伺服器傳送。伺服器接收到請求,然後判斷資源是否變更,是則返回新內容,否則返回304,未變更。這很容易產生誤解,使人誤以為是響應不被快取。實際上Cache-Control: no-cache是會被快取的,只不過每次在向客戶端(瀏覽器)提供響應資料時,快取都要向伺服器評估快取響應的有效性。

(6).no-store:禁止一切快取(這個才是響應不被快取的意思)。

3.Etag & If-None-Match:

它們在HTTP1.1協議中定義,主要用來解決Last-Modified存在的一些問題。

Etag工作過程描述如下:

(1).瀏覽器客戶端對HTTP伺服器頁面A發起請求。

(2).HTTP伺服器返回頁面A,同時給A新增上ETag。

(3).頁面A通過瀏覽器展現給使用者,並且將ETag快取起來。

(4).當客戶端再次請求該頁面時,並將上次快取的起來的ETag傳送到伺服器。

(5).伺服器會比對客服端傳送過來的ETag是否與伺服器的相同,如果相同,就將If-None-Match的值設為false,返回狀態為304,客戶端繼續使用本地快取。

Last-Modified工作過程基本與Etag是一致的;下面看幾個通過Fiddler工具捕捉相關資訊:

a:3:{s:3:\"pic\";s:43:\"portal/201905/07/115209t5ukgf0krd2xfutd.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

相同顏色框中的資料如果相同,那麼就使用快取,否則就從伺服器讀取內容。

特別說明:Etag的優先順序高於Last-Modified;Last-Modified缺點如下:

(1).Last-Modified只能精確到秒,如果檔案在1秒鐘內,被修改多次,將不能準確標註檔案修改時間。

(2).如果檔案被生成,且內容並沒有任何變化,但Last-Modified卻改變,導致檔案沒法使用快取。

(3).有可能存在伺服器沒有準確獲取檔案修改時間,或者與代理伺服器時間不一致等情形。

相關文章