瀏覽器http快取
阿新 • • 發佈:2018-12-20
1.http快取分為強快取和協商快取
強快取
: 強快取命中不會發送請求到伺服器端,直接從本地快取中獲取資源,狀態碼200 ( from cache )
協商快取
:協商快取會發送請求到伺服器,伺服器通過請求頭部欄位來驗證資源是否命中協商快取,如果命中,則返回狀態碼304 ( not modified )
,通知瀏覽器從快取中獲取資源
2.根據響應頭部的欄位確定瀏覽器快取策略
2.1Cache-Control
- no-cache: 資源可以被快取,但立即過期,下次訪問必須驗證資源有效性
- max-age: 快取資源,在指定時間後過期
- no-store: 資源不會被快取
- public: 資源可以被瀏覽器和代理伺服器快取
- private: 資源只能被瀏覽器快取
2.2 Progma
- 只有一個值
no-cache
, 功能和Cache-Control:no-cache
一樣
2.3 Expires
- expires是快取到期時間,以伺服器時間為參考,優先順序比Cache-Control: max-age低
- 在一些場景中必須避免瀏覽器快取,推薦的做法是設定請求頭(Cache-Control: no-cache, no-store, must-revalidate)
3強快取命中條件
- 請求頭不包括Pragma欄位
- 響應頭部Cache-Control中不包括no-cache,no-store
- 響應頭部max-age或者Expires大於請求時間
- 沒有設定以上資訊, 短時間內多次請求。在啟發式演算法時間內, 取響應頭(Date-Lst-Modefied) *0.1作為快取有效時間,在這個時間內,會命中強快取
4命中協商快取
4.1 Last-Modified/If-Modified-Since
伺服器響應資源的時候返回一個頭部欄位 Last-Modified
,代表該資源最後修改時間
當瀏覽器再次向伺服器請求該資源時
會傳送 If-Modified-Since
資訊,意為該時間之後檔案是否有被修改過
伺服器將這個請求時間與本地資源實際最後修改時間做對比,如果檔案沒有被修改,則返回狀態碼 304
,通知瀏覽器從快取中讀取資原始檔。
如果If-Modified-Since的時間比伺服器當前時間(當前的請求時間request_time)還晚,會認為是個非法請求
4.2 ETag/If-None-Match
ETag
是一個響應首部欄位,它是根據資源內容生成的一段hash字串,標識資源的狀態,
由服務端產生。當瀏覽器再次向伺服器請求該資源時
會傳送 If-None-Match
欄位
伺服器收到請求後,拿 If-None-Match
欄位的值與資源的實際 ETage 值進行比較
若相同,則命中協商快取,返回狀態碼 304
。
ETag
優先順序比 Last-Modified
高,同時存在時會以ETag
為準。
那已經有了 Last-Modified
機制,為什麼要引入 ETage
機制呢?
- 某些伺服器不能精確得到資源的最後修改時間,這樣就無法通過最後修改時間判斷資源是否更新
- 如果資源修改非常頻繁,在秒以下的時間內進行修改,而
Last-Modified
只能精確到秒 - 一些資源的最後修改時間改變了,但是內容沒改變,使用
ETag
就能判別出資源內容是否被修改