HTTP與快取相關的頭部

六奇發表於2019-04-16

為什麼使用快取

  • 對於一些不會經常變更的資源(網站logo等靜態資源),使用快取可以減少網路傳輸成本
  • 使用了快取之後提升了載入資源的速度,從一定程度上加快了網頁的渲染

瀏覽器中使用快取的流程

image.png

瀏覽器發起請求

  1. 檢查是否有快取
  2. 有Pragma欄位 no-cache 強制請求 新資源
  3. 有快取並且沒有Pragma,先判斷快取是否過期(Cache-Control 優先於 Expires),沒有過期就使用快取
  4. 快取有效時間過期了,檢視是否使用了Eatg 和 Last-Modified 頭部
  5. 傳送 If-none-Match 和 If-Modified-Since 去驗證是否快取還能繼續使用(可能快取到期了,但是服務端沒有修改,而資源又比較大,通過校驗可以減少網路傳輸)
  6. 資源沒有修改就使用快取
  7. 資源修改了就返回新的資源

快取使用的一些注意點

Expires

  • 一般使用Cache-Control和Expires共存,主要是為了相容http1.0
  • Expires返回的是伺服器時間,需要考慮伺服器與客戶端的時間同步(時區等)
  • 過期之後重新返回的響應中要加入新的Expires

Cache-Control

  • max-age 過期時間是一個時間段,從接受到這個響應之後開始生效,過期之後任然可以使用這個時間段
  • max-age 和 Expires 共存的時候使用max-age
  • no-cache 表示可以快取,但是在使用快取之前需要向伺服器驗證
  • no-store 不快取

Last-Modified

  • 用來標識服務端最後一次修改資源的時間
  • 配合If-Modified-Since使用,檢查快取與服務端是否一致

Etag

  • 服務端資源的唯一標識,看作一種數字簽名
  • 當資源沒有傳送變化的情況下,Etag計算值不發生變化
  • 當有多個服務端的情況下,需要保證不同伺服器上的Etag計算方式一致
  • 需要額外的計算Etag的資源

請求的來源

image.png

修訂檔名

為了避免304,實際檔案發生了修改,但是還是去訪問快取的情況。

  • 用檔名+版本字尾修訂檔名,這樣就相當於一個新的請求
  • 計算檔案的hash或者md5值作為檔名

參考文獻

相關文章