Cache-Control 標頭(the Cache-Control header)
店家包裝商品時,可能附上一張紙條:最佳賞味期到下週二、請勿冷藏、僅供展示。Cache-Control 就是 HTTP 回應的那張紙條。它是伺服器加在回覆上的單一標頭行,帶著一串以逗號分隔的指令,明確告訴路徑上每個快取:可以如何儲存與重用這個回應。它是較舊的 Expires 標頭的現代、精確替代品,也是 HTTP 快取的主要控制旋鈕。
最重要的指令是 max-age,它以秒數給出新鮮度壽命:Cache-Control: max-age=3600 表示快取可在一小時內重用此回應而不必重新驗證。其他常見指令會改變「誰能快取、如何快取」:public(任何快取,包括共用代理與 CDN,皆可儲存)、private(只有終端使用者自己的瀏覽器,共用快取絕不行——用於個人化頁面)、no-cache(你可以儲存,但每次重用前必須先向原始伺服器重新驗證)、以及 no-store(完全不要寫進任何快取,給真正敏感的資料)。指令可以組合,所以 Cache-Control: public, max-age=31536000, immutable 告訴快取:這個檔案可共享、可重用一年、且保證不會改變。
為什麼重要:這一個標頭正是網站快取策略實際被表達的地方,小小的選擇會有大大的影響。常見模式是:對永不改變的資產用很長的 max-age 加上帶指紋的檔名(像 app.9f3c.js),對必須保持最新的 HTML 用 no-cache 或很短的 max-age。一個常見誤解:no-cache 不是「不要快取」——它的意思是「快取,但每次先重新驗證」;真正禁止儲存的指令是 no-store。搞錯這個區別,正是「過時頁面」或「浪費頻寬」的經典來源。
一張頭像圖片帶 Cache-Control: public, max-age=604800。CDN 與瀏覽器都可儲存它,並在一週內不聯絡原始伺服器就提供它。一個登入後的儀表板則帶 Cache-Control: private, no-cache,所以只有那位使用者的瀏覽器會保留它,而且要先重新驗證。
一個標頭、多個旋鈕:壽命(max-age)加上誰可快取(public/private)加上必須重新驗證(no-cache)。
Cache-Control 是伺服器的請求,但快取與用戶端仍可施加自己的限制,使用者也隨時能強制重新整理。它宣告政策,卻無法保證某份副本永不被重新取得。