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

瀏覽器http快取

1.http快取分為強快取和協商快取

  1. 強快取強快取命中不會發送請求到伺服器端,直接從本地快取中獲取資源,狀態碼 200 ( from cache )
  2. 協商快取協商快取會發送請求到伺服器,伺服器通過請求頭部欄位來驗證資源是否命中協商快取,如果命中,則返回狀態碼 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 機制呢?

  1. 某些伺服器不能精確得到資源的最後修改時間,這樣就無法通過最後修改時間判斷資源是否更新
  2. 如果資源修改非常頻繁,在秒以下的時間內進行修改,而 Last-Modified 只能精確到秒
  3. 一些資源的最後修改時間改變了,但是內容沒改變,使用 ETag 就能判別出資源內容是否被修改