當資源需要傳輸時,快取是一種可以加快網絡連接速度的技術,因為傳輸的東西越少,效果就越好。

許多資源可能非常龐大,從時間和實際成本(例如在移動設備上)的角度來看都非常昂貴。

HTTP 提供了不同的快取策略,並由瀏覽器使用。

無快取

首先,Cache-Control 首部可以告訴瀏覽器在檢查 ETag 值(稍後詳述)之前,永遠不要使用快取的資源,如下所示:

Cache-Control: no-cache

更嚴格的 no-store 選項告訴瀏覽器(以及所有中介網路設備)不要將資源存儲在其快取中:

Cache-Control: no-store

如果 Cache-Control 中含有 max-age 值,則此值用於確定該資源作為快取的有效時間(單位為秒):

Cache-Control: max-age=3600

Expires 首部

當發送 HTTP 請求時,瀏覽器會檢查其快取中是否有該頁面的副本,基於所請求的 URL。

如果有,則檢查該頁面的新鮮度

如果HTTP 回應 Expires 首部(/http-response-headers/#expires)值小於當前日期和時間,則該頁面被認為是新鮮的。

Expires 首部的格式如下:

Expires: Sat, 01 Dec 2018 16:00:00 GMT

條件式 GET

有不同的條件式 GET 方法。它們都基於使用 If-* 請求頭:

  • 使用 If-Modified-SinceLast-Modified
  • 使用 If-None-MatchETag

使用 If-Modified-SinceLast-Modified

瀏覽器可以發送帶有 If-Modified-Since 首部的請求到服務器,該頭部基於當前快取頁面中獲取的 Last-Modified 首部值。

這告訴服務器只有在資源自該日期以來有過更新時,才返回響應主體(頁面內容)。

否則,服務器返回一個 304 Not Modified 響應。

使用 If-None-MatchETag

Web 服務器(根據設置、頁面提供等)可以發送一個 ETag 首部

這是資源的標識符。每當資源發生變化時,例如更新,ETag 也應該相應變化。

它相當於一個檢查和驗證碼。

瀏覽器發送一個包含一個(或多個) ETag 值的 If-None-Match 首部

如果沒有匹配的 ETag,服務器返回最新的資源版本;否則返回 304 Not Modified 響應。