當資源需要傳輸時,快取是一種可以加快網絡連接速度的技術,因為傳輸的東西越少,效果就越好。
許多資源可能非常龐大,從時間和實際成本(例如在移動設備上)的角度來看都非常昂貴。
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-Since
和Last-Modified
- 使用
If-None-Match
和ETag
使用 If-Modified-Since
和 Last-Modified
瀏覽器可以發送帶有 If-Modified-Since
首部的請求到服務器,該頭部基於當前快取頁面中獲取的 Last-Modified
首部值。
這告訴服務器只有在資源自該日期以來有過更新時,才返回響應主體(頁面內容)。
否則,服務器返回一個 304 Not Modified
響應。
使用 If-None-Match
和 ETag
Web 服務器(根據設置、頁面提供等)可以發送一個 ETag 首部。
這是資源的標識符。每當資源發生變化時,例如更新,ETag 也應該相應變化。
它相當於一個檢查和驗證碼。
瀏覽器發送一個包含一個(或多個) ETag 值的 If-None-Match
首部。
如果沒有匹配的 ETag,服務器返回最新的資源版本;否則返回 304 Not Modified
響應。