HTTP緩存與Chrome瀏覽器的緩存協作 研究

前言

網頁與網頁資源的緩存是瀏覽器與服務器端共同協作完成的。主要參與者 Cache-Control、Etag、LastModified三者。

Cache-Control

Cache-Control扮演着緩存最主要的角色,Etag與LastModified是協商緩存的主要角色。

取值爲no-store

當相應頭中有Cache-Control no-store的時候。瀏覽器不會使用任何緩存,也不會有任何協商緩存參與(etag與LastModified).

取值爲no-cache

Cache-Control爲no-cache的時候會先去進行協商緩存即通過etag或者LastMdoified進行驗證本地的緩存是否有效。當服務端驗證後告訴瀏覽器你那邊的緩存可以用(即返回304)或者不可以(返回200狀態並返回對應的內容)。注意Cache-Control爲maxage=0時與no-cache效果相同

取值爲must-revalidate

Cache-Control爲must-revalidate時,會在使用緩存前進行緩存驗證,驗證方式與no-cache有所不同。no-cache永遠都會使用協商緩存。但是must-revalidate會由瀏覽器自身新鮮度檢測策略來定。對於html文件來說會一直使用協商緩存,但是對於js,css,img對象就不一樣,如果在短時間內再次訪問該資源一般會從memory-cache或者diskcache中獲取,有時候又會通過協商緩存。

取值爲max-age > 0s 單位秒

Cache-Control爲max-age > 0 。所有資源都會緩存到指定秒數之前,在緩存期間原則上永遠也不會訪問服務器。注意我加了一個“原則上”是因爲我在用Chrome測試時遇到了這個請。當我刷新時,對應url地址的html文件會使用協商緩存,但是當我在一個空標籤輸入這個url地址點擊回車時,這個html文件會是disk-cache。

Etag

Etag時通過爲文件計算一個指紋值,返回給瀏覽器,瀏覽器記住這個指紋。當使用瀏覽器進行緩存驗證是,會發送請求頭 If-None-Match=指紋(If-None-Match顧名思義如果指紋不匹配你就給我返回新的數據),服務端發現請求頭中存在If-None-Match就會去匹配新的指紋,如果相等則範圍304否則範圍200和數據內容

LastModified

LastModifed顧名思義是通過文件的最後修改時間來校驗緩存。瀏覽器進行緩存校驗是,會發送請求頭
If-Modified-Since=最後修改時間(顧名思義如果文件的修改時間大於了我發送給你的時間,你服務器就必須返回新數據給我),服務器發現請求頭中存在If-Modified-Since則會去使用修改時間器對比發現在給定時間之後修改我就返回新數據給瀏覽器否則返回304。

據我猜測如果同時存在If-Modified-Since和If-None-Match頭瀏覽器應該優先使用If-None-Match。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章