本文將介紹http中強制緩存和協商緩存的區別前端
瀏覽器緩存(Brower Caching)是瀏覽器對以前請求過的文件進行緩存,以便下一次訪問時重複使用,節省帶寬,提升訪問速度,下降服務器壓力瀏覽器
http緩存機制主要在http響應頭中設定,響應頭中相關字段爲Expires、Cache-Control、Last-Modified、Etag。緩存
HTTP 1.0協議中的。簡而言之,就是告訴瀏覽器在約定的這個時間前,能夠直接從緩存中獲取資源(representations),而無需跑到服務器去獲取。服務器
另:網絡
第一次請求:工具
瀏覽器緩存分爲強緩存和協商緩存spa
200 form memory cache : 不訪問服務器,通常已經加載過該資源且緩存在了內存當中,直接從內存中讀取緩存。瀏覽器關閉後,數據將不存在(資源被釋放掉了),再次打開相同的頁面時,不會出現from memory cache。3d
200 from disk cache: 不訪問服務器,已經在以前的某個時間加載過該資源,直接從硬盤中讀取緩存,關閉瀏覽器後,數據依然存在,此資源不會隨着該頁面的關閉而釋放掉下次打開仍然會是from disk cache。代理
優先訪問memory cache,其次是disk cache,最後是請求網絡資源code
強緩存:
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:禁止一切緩存(這個纔是響應不被緩存的意思)。
複製代碼
cache-control是http1.1的頭字段,expires是http1.0的頭字段,若是expires和cache-control同時存在,cache-control會覆蓋expires,建議兩個都寫。
協商緩存:
Last-Modifued/If-Modified-Since和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
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
- Last-Modifued/If-Modified-Since是http1.0的頭字段