此頁面由社群從英文翻譯而來。了解更多並加入 MDN Web Docs 社群。
Cache-Control
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
Cache-Control 標頭中的指令用來控制 HTTP 請求、回應的快取行為。HTTP 請求跟回應可以擁有不同的快取控制指令。
In this article
語法
快取指令必須遵守這些規則:
- 大小寫沒差(但儘量用小寫)
- 指令之間用逗號(,)分開
- Some directives have an optional argument, which can be either atoken or aquoted-string. (See spec for definitions)
請求用指令
可以在 HTTP 請求中使用的標準Cache-Control 指令
Cache-Control: max-age=<秒數>Cache-Control: max-stale[=<秒數>]Cache-Control: min-fresh=<秒數>Cache-Control: no-cacheCache-Control: no-storeCache-Control: no-transformCache-Control: only-if-cached回應用指令
可以在 HTTP 回應中使用的標準Cache-Control 指令
Cache-Control: must-revalidateCache-Control: no-cacheCache-Control: no-storeCache-Control: no-transformCache-Control: publicCache-Control: privateCache-Control: proxy-revalidateCache-Control: max-age=<秒數>Cache-Control: s-maxage=<秒數>擴充 Cache-Control 指令
這些擴充的Cache-Control 指令不是 HTTP 快取的核心標準。使用前請檢查相容性,客戶端會直接忽略不支援的指令。
Cache-Control: immutableCache-Control: stale-while-revalidate=<秒數>Cache-Control: stale-if-error=<秒數>指令
>可快取性
這些指令定義 HTTP 請求/回應是否可以做快取、儲存在哪,以及使用前是否要跟後端伺服器做驗證
public此回應可以被任何快取軟體儲存起來,即使它本身通常是不可快取的。
private此回應只可以被瀏覽器儲存起來,即使它本身通常是不可快取的。如果你真的不要任何快取軟體儲存你的回應,可以使用
no-store。這個指令不是用來防止快取軟體儲存回應的。no-cache此回應可以被任何快取軟體儲存起來,即使它本身通常是不可快取的。不過,在使用儲存起來的 HTTP 回應之前,必須必須向後端伺服器做驗證,因此你不能拿
no-cache跟immutable一起使用。如果你真的不要任何快取軟體儲存你的回應,可以使用no-store。這個指令不是用來防止快取軟體儲存回應的。no-store此回應不能被任何快取軟體儲存起來。當然它無法防止先前儲存起來 的回應被回傳。客戶端可以用
max-age=0來清除快取,並強制向後端伺服器做驗證。(其他指令跟no-store一起使用都無效)
過期
max-age=<秒數>快取有效的最大時間。跟
Expires不一樣,這個指令是相對於請求當下的時間。s-maxage=<秒數>覆寫
max-age或者Expires標頭,不過只對共用快取軟體生效(比如 nginx)。私有快取會無視這個指令。max-stale[=<秒數>]表示客戶端可以接受過期回應。可以宣告客戶端最多能接受過期多久。
min-fresh=<秒數>表示客戶端想要有效時間至少在指定秒數以上的回應。
stale-while-revalidate=<秒數>實驗性質表示客戶端可以接受過期回應,但同時在背景檢查最新版本。秒數用來控制客戶端最多能接受過期多久。何時過期取決於
max-age的值。想了解更多細節請到Google 如何透過過時的重新驗證方式改善廣告成效。stale-if-error=<秒數>實驗性質表示客戶端會執行驗證,若驗證錯誤了就直接使用過期回應。秒數用來控制客戶端最多能接受過期多久。
驗證與重新讀取
must-revalidate表示一旦過期,必須向後端伺服器做驗證。
proxy-revalidate跟
must-revalidate類似,不過只對共用快取軟體生效(比如 nginx)。私有快取會無視這個指令。immutable表示回應內容不會改變 。這個資源不會過期,因此即使使用者手動重新整理頁面,客戶端也不會用驗證標頭 (比如
If-None-Match或If-Modified-Since)。 Clients that aren't aware of this extension must ignore them as per the HTTP specification. 在 Firefox 中,immutable只有在使用https://時會生效。想知道更多資訊,可以閱讀這篇文章。
其他
no-transform位於中間的快取軟體或代理軟體不能修改回應內容、
Content-Encoding、Content-Range、Content-Type。因此它可能造成某些代理軟體或瀏覽器的功能失效,比如說Google's Web Light可以替很慢的網路事先壓縮圖片。only-if-cached由客戶端設定,表示不想經由網路得到回應。所以快取軟體可能會回傳先前儲存的回應,或者是
504狀態碼。使用驗證標頭如If-None-Match是沒有意義的。由伺服器在 HTTP 回應中設定only-if-cached指令也沒有意義。
範例
>防止被快取
想要禁止快取一個資源,你可以在回應中設定這個標頭:
快取靜態檔案
對於那些不會更新的檔案,你可以在回應中使用下列這個激進的標頭。比如說用在圖片、CSS 檔案,以及 JavaScript 檔案。附帶一提,也可以看看Expires 標頭。
Cache-Control: public, max-age=604800, immutable
必須執行驗證
no-cache、max-age=0, must-revalidate 是同樣的意思。表示客戶端可以儲存資源,但使用它前必須做驗證。這表示每次都會發生 HTTP 請求,不過只要沒過期就不用下載完整內容
Cache-Control: no-cache
Cache-Control: max-age=0, must-revalidate
附帶一提: 這個設定可以在伺服器掛掉的時候使用過期資源
Cache-Control: max-age=0Specifications
| Specification |
|---|
| HTTP Caching> # field.cache-control> |
| HTTP Immutable Responses> # the-immutable-cache-control-extension> |