在 Web 開發中,HTTP 快取機制是優化效能、減少伺服器負載的關鍵。本文將深入剖析 HTTP 訊息標頭中的快取控制指令,包含 Cache-Control、Expires、Pragma 等核心欄位,並整理常見的 PHP header() 實作範例,協助開發者精準掌握瀏覽器快取行為。
Cache-Control 是 HTTP/1.1 規範中控制快取行為的主要標頭,預設值為 private。常見指令值與其行為對照表如下:
| 指令值 | 開新視窗 | 網址列按 Enter | 按「上一頁」 | 按「重新整理」 |
|---|---|---|---|---|
private / must-revalidate | 重新請求伺服器 | 僅首次請求 | 不重新請求 | 強制重新請求 |
no-cache | 重新請求伺服器 | 每次皆請求 | 每次皆請求 | 強制重新請求 |
max-age=秒數 | 期限內不請求伺服器 | 期限內不請求 | 不重新請求 | 強制重新請求 |
範例:
Cache-Control: max-age=5
Cache-Control: no-cache
Expires 指定資源過期的絕對時間(GMT 格式)。若設為已過期的時間,瀏覽器會視為快取失效,每次皆重新請求。
Expires: Fri, 31 Dec 1999 16:00:00 GMT
Expires: -1
若頁面每日固定時間更新(如凌晨 1 點),可設定 Expires 為隔天凌晨 1 點,達到定時失效效果。
舊版 HTTP/1.0 不支援 Cache-Control,IE 透過 Pragma: no-cache 提供特殊支援。需注意:僅在 HTTPS 安全連線下才能有效防止快取;非安全連線下行為等同 Expires: -1(會被快取但標記立即過期)。
為確保跨瀏覽器、跨協議版本的防快取效果,建議同時輸出以下三組標頭:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // 過去時間
header('Pragma: no-cache');
header() 函數發送原始 HTTP 標頭,結構包含三部分:HTTP 版本、狀態碼、原因短語。以下整理實務常見用法:
header('HTTP/1.1 200 OK'); // 正常回應(修正 URL Rewrite 導致的 404)
header('HTTP/1.1 404 Not Found'); // 頁面不存在
header('HTTP/1.1 301 Moved Permanently'); // 永久重導(利於 SEO 更新網址)
header('HTTP/1.1 403 Forbidden'); // 存取受限
header('HTTP/1.1 500 Internal Server Error'); // 伺服器錯誤
header('Location: https://example.com'); // 立即重導
header('Refresh: 10; url=https://example.com'); // 10 秒後重導
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $time) . ' GMT');
header('ETag: "unique-resource-id"');
header('HTTP/1.1 304 Not Modified'); // 告知瀏覽器內容未變更
header('Content-Length: 1234'); // 指定內容長度(利於快取)
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: application/json');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"');
header('Content-Transfer-Encoding: binary');
readfile('example.zip'); // 輸出檔案內容
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
echo '取消或輸入錯誤帳密時顯示的文字';
max-age、ETag、Last-Modified 實現高效快取。Cache-Control,避免舊資料污染。Content-Type、Content-Disposition、Content-Length 確保瀏覽器正確處理。掌握 HTTP 快取標頭不僅能提升網站效能,更能避免資料不一致、安全性風險等潛在問題。建議開發者建立標準化的標頭輸出函式庫,統一管理專案中的快取策略。