HTTP快取筆記(1)

VitoLI發表於2018-08-29

HTTP快取

筆記來自:MDN

主要有兩種,私有快取(private caches)或者共享快取(shared caches)。

cache
快取示意圖

快取控制頭Cache-Control header

  • 禁止快取

每次請求都會下載完整的響應內容

Cache-Control: no-store,
Cache-Control: no-cache, no-store, must-revalidate
複製程式碼
  • 強制確認快取

每次請求發出時,快取會將此請求傳送到伺服器,該請求會帶有與本地快取相關的驗證欄位,伺服器端會根據驗證資訊判斷是否使用本地快取。

Cache-Control: no-cache
複製程式碼
  • 私有快取和公共快取

"public" 指令表示該響應可以被任何中間人(譯者注:比如中間代理、CDN等)快取。若指定了"public",則一些通常不被中間人快取的頁面(譯者注:因為預設是private)(比如 帶有HTTP驗證資訊(帳號密碼)的頁面 或 某些特定影響狀態碼的頁面),將會被其快取。

而 "private" 則表示該響應是專用於某單個使用者的,中間人不能快取此響應,該響應只能應用於瀏覽器私有快取中。

Cache-Control: private
Cache-Control: public
複製程式碼
  • 快取過期機制

max-age=, 表明這個快取相對於上次請求的時間間隔內是可以繼續使用的,否則就應該失效。

Cache-Control: max-age=31536000
複製程式碼
  • 快取驗證

當使用must-revalidate時,表示在使用快取前必須驗證舊資源是否過期了。詳情

Cache-Control: must-revalidate
複製程式碼

為什麼需要重新整理快取(freshness)

一旦資源被儲存在快取中,理論上應該一直儲存著,但是由於快取的空間是有限的,所以會週期性的移除一些已被快取的資源,這個過程被稱為快取清除(cache eviction)。並且伺服器上的資源可能已經更新了,所以cache也應該被更新。由於HTTP是一個client-server協議,當資源改變時伺服器無法通知cache和client;它們只能通過過期機制(expiration),在沒過期之前,這個資源是新的(fresh);過期後資源是stale(陳舊)狀態。清除演算法優先清理舊資源,但是實際上舊資源不是被清除演算法清除的,當快取系統收到一個對舊資源的請求時,它會將這個request帶上If-None-Match欄位去檢查這個資源到底是新的還是舊的。如果是fresh狀態,則返回304(Not Midified)header,並且response body不會包含請求的資源,這樣的話還可以節省一些頻寬。

下面是典型的快取處理過程:

image

相關文章