HTTP 快取
前言
為什麼需要 HTTP 快取?
對於開發者而言 ...
明明推版了為什麼沒更新
所以我們就來好好瞭解一下
瀏覽器和伺服器請求靜態資源會發生哪些事?
伺服器
瀏覽器快取
請求
回應資源和快取策略
給你資源
有快取嗎?
有過期嗎?
存入快取
那瀏覽器怎麼得知靜態資源的快取策略?
Cache-Control: public, max-age=2592000
Etag: W/"7b1d7f457d056ace7b230b587b9f3753"
Cache-Control
常見 Cache-Control 的指令
public
private
no-store
no-cache
max-age
決定用哪種方式儲存快取
快取新不新鮮
(Expired)
可以存在 CDN 或 proxy 和瀏覽器快取
只能存在瀏覽器快取
完全不要快取
可以被快取,但使用前是還是得向伺服器確認有沒有新版本,沒有才可以使用
從請求後過多久過期,單位(秒)
Cache-Control: public, max-age=30
過期了不代表不能用
Time-based
Content-based
伺服器
瀏覽器快取
請求帶著比對的資料
回應資源或是可以從快取拿
有快取但過期了
有過期嗎?
有快取嗎?
Time-based
Cache-Control:public, max-age=31536000
Last-Modified: Wed, 12 May 2020 17:45:57 GMT
If-Modified-Since: Wed, 12 May 2020 17:45:57 GMT
第一次回應
過期後請求
Content-based
Cache-Control:public, max-age=31536000
ETag: "15f0fff99ed5aae4edffdd6496d7131f"
If-None-Match: "15f0fff99ed5aae4edffdd6496d7131f"
第一次回應
過期後請求
etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
r->headers_out.last_modified_time,
r->headers_out.content_length_n)
回到之前的問題,所以為什麼會推版卻沒更新?
那設定 no-cache 驗證一下不就好了?
那用 Etag 應該很像吧?
所以 Webpack 才會有 Hash, ContentHash ...
END
HTTP CACHE
By Steven Ho
HTTP CACHE
- 363