瀏覽器緩存是指瀏覽器在本地存儲已經請求過的資源的一種機制,以便在將來的請求中能夠更快地獲取這些資源,減少對服務器的請求,提高頁面加載速度。瀏覽器緩存主要涉及到兩個方面:緩存控制和緩存位置。
緩存控制
Expires 頭:
作用: 通過 Expires 頭指定資源的過期時間,即資源在客戶端緩存的有效期。
示例: Expires: Tue, 10 Nov 2023 12:00:00 GMT
Cache-Control 頭:
作用: 提供更靈活的緩存控制,包括 public(可以被任何中間緩存和終端緩存)、private(只能被終端緩存)、no-cache(需要先驗證是否過期)、max-age(指定緩存的最大有效時間)等。
示例: Cache-Control: max-age=3600, public
Last-Modified 頭:
作用: 指定資源最后一次修改的時間。
示例: Last-Modified: Tue, 01 Nov 2022 08:00:00 GMT
If-Modified-Since 頭:
作用: 客戶端發送該頭,用于條件性地請求服務器,僅在資源在指定時間后被修改時才會返回資源內容。
示例: If-Modified-Since: Tue, 01 Nov 2022 08:00:00 GMT
ETag 頭:
作用: 提供一個唯一的標識符,當資源被修改時,ETag 會發生變化。
示例: ETag: “abc123”
If-None-Match 頭:
作用: 客戶端發送該頭,用于條件性地請求服務器,僅在資源的 ETag 值與指定的值不匹配時才返回資源內容。
示例: If-None-Match: “abc123”
緩存位置
Memory Cache(內存緩存):
緩存在內存中,讀取速度快,但容量較小,僅在瀏覽器打開時有效。
Disk Cache(磁盤緩存):
緩存在磁盤中,容量相對較大,可以在瀏覽器關閉后依然有效。
Service Worker Cache(Service Worker 緩存):
使用 Service Worker 技術,可以在離線狀態下提供緩存服務,用于構建離線應用。
Push Cache:
用于存儲通過 HTTP/2 服務器推送而來的資源。
緩存的流程
首次請求:
瀏覽器向服務器請求資源。
服務器響應:
服務器返回資源,并在響應頭中設置相應的緩存控制信息。
瀏覽器緩存:
瀏覽器將資源保存在緩存中,同時記錄緩存控制信息。
再次請求:
如果資源沒有過期,瀏覽器直接從緩存中讀取資源,不再請求服務器。
條件性請求:
如果資源過期或被修改,瀏覽器通過條件性請求(如 If-Modified-Since 或 If-None-Match)向服務器驗證是否需要獲取新的資源。
更新緩存:
如果服務器返回新的資源,瀏覽器將新的資源存儲在緩存中,更新緩存控制信息。
通過合理設置緩存控制頭,開發者可以更好地控制客戶端緩存的行為,從而提升用戶體驗和加速頁面加載。