1. 程式人生 > >【快取】-瀏覽器快取

【快取】-瀏覽器快取

簡介

瀏覽器快取(Brower Caching)是瀏覽器在本地磁碟對使用者最近請求過的文件進行儲存,當訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁碟載入文件

瀏覽器快取請求引數

1、瀏覽器第一次請求時,會發出一組 HTTP 頭,用來指導瀏覽器如何進行快取。伺服器規定一個資源是否要進行快取,主要由響應頭中的Expires/Cache-Control兩個欄位來控制。
(1)Expires:http1.0時的規範,它的值為一個絕對時間的GMT格式的時間字串

(2)Cache-Control:是http1.1時出現的header資訊,主要是利用該欄位的max-age值來進行判斷,它是一個相對時間。其它引數如下:
no-cache:不使用快取
no-store:直接禁止遊覽器快取資料
public:可以被所有的使用者快取,包括終端使用者和CDN等中間代理伺服器
private:只能被終端使用者的瀏覽器快取,不允許CDN等中繼快取伺服器對其快取

(3)同時啟用的時候Cache-Control優先順序高

2、Etag/If-None-Match 和 Last_Modified/If-Modify-Since
(1)Last_Modified :http1.0時的規範,它是標識該資源的最後修改時間。當瀏覽器再次請求該資源時,request的請求頭中會包含If-Modify-Since,該值為快取之前返回的Last-Modify。伺服器收到If-Modify-Since後,根據資源的最後修改時間判斷是否命中協商快取。若命中,則瀏覽器返回304響應,並更新快取中的相應頭資訊。否則,返回最新的資源內容。

(2)Etag:http1.1時的規範,當瀏覽器第一次請求一個檔案時,伺服器會生成並返回一個隨機令牌即Etag,通常是檔案內容的雜湊值或者某個其他指紋碼。客戶端在下一個請求中通過If-None-Match

欄位將Etag的值傳送給伺服器:如果指紋碼仍然一致,說明資源未被修改,返回304。如果不一致,說明資源已修改,則返回最新的資源內容。

(3)HTTP1.1中Etag的出現主要是為了解決幾個Last-Modified比較難解決的問題,例如,一些檔案可能會週期性的更改,但是它的內容並不改變

(4)兩者是可以一起使用的,伺服器會優先驗證ETag

強快取和協商快取

1、強快取

使用者第二次請求時,瀏覽器會先獲取該資源快取的header資訊,根據Expires/Cache-Control 欄位判斷請求時間,如果下次請求時間在這個時間以前,則可以直接從快取中獲取資源,不必與伺服器進行通訊,返回的狀態碼為200。我們把這種機制稱為強快取。

2、協商快取

如果使用者第二次請求時間超過快取有效期,瀏覽器就會發送請求到伺服器,由伺服器來決定下一步該怎麼辦,這個過程稱為協商快取

瀏覽器快取機制

參考下圖:
這裡寫圖片描述

瀏覽器快取過程

1、瀏覽器第一次載入資源,伺服器返回200, 瀏覽器將資源下載下來,把資源和response header相關內容一併快取。

2、下一次載入時,首先比較cache-control,如果沒有超過時間,則命中強快取,不傳送請求,直接讀取本地檔案(如果不支援http1.1,則使用expires來判斷);如果時間已經過期,則傳送帶有if-none-match和if-modified-since的請求頭。

3、伺服器接受到請求之後,首先判斷etag(資源的內容標識)是否和伺服器上檔案的etag一致,如果一致,則命中協商快取,返回304;如果不一致,返回新的資源並帶上新的etag值返回200。

4、如果請求中沒有etag值,則比較傳送來的 if-modified-since 值,如果命中,則返回304,;否則,返回新的資源帶上新的last-modified的值並返回狀態碼200。

使用者行為對瀏覽器快取的控制

1、位址列訪問,連結跳轉是正常使用者行為,將會觸發瀏覽器快取機制;

2、F5重新整理,瀏覽器會設定max-age=0,跳過強快取判斷,進行協商快取判斷;

3、ctrl+F5重新整理,跳過強快取和協商快取,直接從伺服器拉取資源。

……完