1. 程式人生 > >瀏覽器快取相關

瀏覽器快取相關

瀏覽器快取問題:

簡單來說,瀏覽器快取就是把一個已經請求過的Web資源(如html頁面,圖片,js,資料等)拷貝一份副本儲存在瀏覽器中。快取會根據進來的請求儲存輸出內容的副本。當下一個請求來到的時候,如果是相同的URL,快取會根據快取機制決定是直接使用副本響應訪問請求,還是向源伺服器再次傳送請求。比較常見的就是瀏覽器會快取訪問過網站的網頁,當再次訪問這個URL地址的時候,如果網頁沒有更新,就不會再次下載網頁,而是直接使用本地快取的網頁。只有當網站明確標識資源已經更新,瀏覽器才會再次下載網頁。

為什麼使用快取:

(1)減少網路頻寬消耗

(2)降低伺服器壓力

(3)減少網路延遲,加快頁面開啟速度

瀏覽器端的快取規則:

新鮮度(過期機制):也就是快取副本有效期。

校驗值(驗證機制):資源的實體標籤Etag(EntityTag)

解決方法:

(1)使用HTMLMeta標籤

Web開發者可以在HTML頁面的<head>節點中加入<meta>標籤,程式碼如下

<metahttp-equiv="Pragma"content="no-cache">

事實上這種禁用快取的形式用處很有限:

 a.僅有IE才能識別這段meta標籤含義,其它主流瀏覽器僅識別“Cache-Control:no-store”的meta標籤。
 b.在IE中識別到該meta標籤含義,並不一定會在請求欄位加上Pragma,但的確會讓當前頁面每次都發新請求(僅限頁面,頁面上的資源則不受影響)

(2)使用快取有關的HTTP訊息報頭

在HTTP請求和響應的訊息報頭中,常見的與快取有關的訊息報頭有:

規則

訊息包頭

值/示例

型別

作用

新鮮度

Pragma

no-cache

響應

告訴瀏覽器忽略資源的快取副本,每次訪問都需要去伺服器拉取【http1.0中存在的欄位,在http1.1已被拋棄,使用Cache-Control替代,但為了做http協議的向下相容,很多網站依舊會帶上這個欄位】

Expires

Mon,15Aug201603:56:47GMT

響應

啟用快取和定義快取時間。告訴瀏覽器資源快取過期時間,如果還沒過該時間點則不發請求【http1.0中存在的欄位,該欄位所定義的快取時間是相對伺服器上的時間而言的,如果客戶端上的時間跟伺服器上的時間不一致(特別是使用者修改了自己電腦的系統時間),那快取時間可能就沒啥意義了。在HTTP1.1版開始,使用Cache-Control:max-age=秒替代】

Cache-Control

no-cache

響應

告訴瀏覽器忽略資源的快取副本,強制每次請求直接傳送給伺服器,拉取資源,但不是“不快取”

no-store

響應

強制快取在任何情況下都不要保留任何副本

max-age=[秒]

響應

指明快取副本的有效時長,從請求時間開始到過期時間之間的秒數

public

響應

任何路徑的快取者(本地快取、代理伺服器),可以無條件的快取改資源

private

響應

只針對單個使用者或者實體(不同使用者、視窗)快取資源

Last-Modified

Mon,15Aug201603:56:47GMT

響應

告訴瀏覽器這個資源最後的修改時間。伺服器將資源傳遞給客戶端時,會將資源最後更改的時間以“Last-Modified:GMT”的形式加在實體首部上一起返回給客戶端【只能精確到秒級,如果某些檔案在1秒鐘以內,被修改多次的話,它將不能準確標註檔案的修改時間】

If-Modified-Since

Mon,15Aug201603:56:47GMT

請求

其值為上次響應頭的Last-Modified值,再次向web伺服器請求時帶上頭If-Modified-Since。web伺服器收到請求後發現有頭If-Modified-Since則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應訊息包體內),包括更新Last-Modified的值,HTTP200;若最後修改時間較舊,說明資源無新修改,則響應HTTP304(無需包體,節省瀏覽),告知瀏覽器繼續使用所儲存的cache

校驗值

ETag

"fd56273325a2114818df4f29a628226d"

響應

告訴瀏覽器當前資源在伺服器的唯一識別符號(生成規則又伺服器決定)

If-None-Match

"fd56273325a2114818df4f29a628226d"

請求

當資源過期時(使用Cache-Control標識的max-age),發現資源具有Etage宣告,則再次向web伺服器請求時帶上頭If-None-Match(Etag的值)。web伺服器收到請求後發現有頭If-None-Match則與被請求資源的相應校驗串進行比對,決定返回200或304