強制快取(200)和協商快取(304)

Little heaven發表於2019-05-06

本文將介紹強制快取(200)和協商快取(304)的區別

1. 什麼是快取?

瀏覽器快取(Brower Caching)是瀏覽器對之前請求過的檔案進行快取,以便下一次訪問時重複使用,節省頻寬,提高訪問速度,降低伺服器壓力

http快取機制主要在http響應頭中設定,響應頭中相關欄位為Expires、Cache-Control、Last-Modified、If-Modified-Since、Etag。

HTTP 1.0協議中的。簡而言之,就是告訴瀏覽器在約定的這個時間前,可以直接從快取中獲取資源(representations),而無需跑到伺服器去獲取。

另:Expires因為是對時間設定的,且時間是Greenwich Mean Time (GMT),而不是本地時間,所以對時間要求較高。

2. 瀏覽器是如何判斷是否使用快取的

第一次請求:

強制快取(200)和協商快取(304)
第二次請求相同網頁:

強制快取(200)和協商快取(304)

3. 快取的類別

瀏覽器快取分為強快取和協商快取

強快取:瀏覽器不會像伺服器傳送任何請求,直接從本地快取中讀取檔案並返回Status Code: 200 OK

強制快取(200)和協商快取(304)

強制快取(200)和協商快取(304)

200 form memory cache : 不訪問伺服器,一般已經載入過該資源且快取在了記憶體當中,直接從記憶體中讀取快取。瀏覽器關閉後,資料將不存在(資源被釋放掉了),再次開啟相同的頁面時,不會出現from memory cache。

200 from disk cache: 不訪問伺服器,已經在之前的某個時間載入過該資源,直接從硬碟中讀取快取,關閉瀏覽器後,資料依然存在,此資源不會隨著該頁面的關閉而釋放掉下次開啟仍然會是from disk cache。

優先訪問memory cache,其次是disk cache,最後是請求網路資源

協商快取: 向伺服器傳送請求,伺服器會根據這個請求的request header的一些引數來判斷是否命中協商快取,如果命中,則返回304狀態碼並帶上新的response header通知瀏覽器從快取中讀取資源;

強制快取(200)和協商快取(304)

4. 強快取和協商快取的header引數

強快取:

Expires:過期時間,如果設定了時間,則瀏覽器會在設定的時間內直接讀取快取,不再請求

Cache-Control:當值設為max-age=300時,則代表在這個請求正確返回時間(瀏覽器也會記錄下來)的5分鐘內再次載入資源,就會命中強快取。

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:禁止一切快取(這個才是響應不被快取的意思)。
複製程式碼

協商快取:

Last-Modifued/If-Modified-Since和Etag/If-None-Match是分別成對出現的,呈一一對應關係

Etag/If-None-Match:

Etag:

Etag是屬於HTTP 1.1屬性,它是由伺服器(Apache或者其他工具)生成返回給前端,用來幫助伺服器控制Web端的快取驗證。 Apache中,ETag的值,預設是對檔案的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後得到的。

If-None-Match:

當資源過期時,瀏覽器發現響應頭裡有Etag,則再次像伺服器請求時帶上請求頭if-none-match(值是Etag的值)。伺服器收到請求進行比對,決定返回200或304

強制快取(200)和協商快取(304)

Last-Modifued/If-Modified-Since:

Last-Modified:

瀏覽器向伺服器傳送資源最後的修改時間

If-Modified-Since:

當資源過期時(瀏覽器判斷Cache-Control標識的max-age過期),發現響應頭具有Last-Modified宣告,則再次像伺服器請求時帶上頭if-modified-since,表示請求時間。伺服器收到請求後發現有if-modified-since則與被請求資源的最後修改時間進行對比(Last-Modified),若最後修改時間較新(大),說明資源又被改過,則返回最新資源,HTTP 200 OK;若最後修改時間較舊(小),說明資源無新修改,響應HTTP 304 走快取。

Last-Modifued/If-Modified-Since的時間精度是秒,而Etag可以更精確。 Etag優先順序是高於Last-Modifued的,所以伺服器會優先驗證Etag

相關文章