首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

HTTP 快取控制完全指南:Cache-Control、Expires 與 Header 指令深度解析

     編輯:PHP 相關知識

在 Web 開發中,HTTP 快取機制是優化效能、減少伺服器負載的關鍵。本文將深入剖析 HTTP 訊息標頭中的快取控制指令,包含 Cache-Control、Expires、Pragma 等核心欄位,並整理常見的 PHP header() 實作範例,協助開發者精準掌握瀏覽器快取行為。

一、Cache-Control:快取控制的核心指令

Cache-Control 是 HTTP/1.1 規範中控制快取行為的主要標頭,預設值為 private。常見指令值與其行為對照表如下:

指令值開新視窗網址列按 Enter按「上一頁」按「重新整理」
private / must-revalidate重新請求伺服器僅首次請求不重新請求強制重新請求
no-cache重新請求伺服器每次皆請求每次皆請求強制重新請求
max-age=秒數期限內不請求伺服器期限內不請求不重新請求強制重新請求

範例:

Cache-Control: max-age=5  
Cache-Control: no-cache   

二、Expires:舊版相容的過期時間控制

Expires 指定資源過期的絕對時間(GMT 格式)。若設為已過期的時間,瀏覽器會視為快取失效,每次皆重新請求。

Expires: Fri, 31 Dec 1999 16:00:00 GMT  
Expires: -1  

若頁面每日固定時間更新(如凌晨 1 點),可設定 Expires 為隔天凌晨 1 點,達到定時失效效果。

三、Pragma:HTTP/1.0 相容性支援

舊版 HTTP/1.0 不支援 Cache-Control,IE 透過 Pragma: no-cache 提供特殊支援。需注意:僅在 HTTPS 安全連線下才能有效防止快取;非安全連線下行為等同 Expires: -1(會被快取但標記立即過期)。

四、完整的防快取標頭組合(PHP 實作)

為確保跨瀏覽器、跨協議版本的防快取效果,建議同時輸出以下三組標頭:

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');

五、PHP header() 常用指令速查表

header() 函數發送原始 HTTP 標頭,結構包含三部分:HTTP 版本、狀態碼、原因短語。以下整理實務常見用法:

1. 狀態碼控制

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'); // 伺服器錯誤

2. 重導與延遲

header('Location: https://example.com');           // 立即重導
header('Refresh: 10; url=https://example.com');    // 10 秒後重導

3. 快取與驗證相關

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');       // 指定內容長度(利於快取)

4. 內容類型與下載

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'); // 輸出檔案內容

5. HTTP 認證

header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
echo '取消或輸入錯誤帳密時顯示的文字';

六、實務建議總結

  • 動態頁面:務必輸出完整防快取標頭組合(Cache-Control + Expires + Pragma)。
  • 靜態資源:善用 max-age、ETag、Last-Modified 實現高效快取。
  • API 介面:視資料更新頻率設定適當 Cache-Control,避免舊資料污染。
  • 檔案下載:正確設定 Content-Type、Content-Disposition、Content-Length 確保瀏覽器正確處理。

掌握 HTTP 快取標頭不僅能提升網站效能,更能避免資料不一致、安全性風險等潛在問題。建議開發者建立標準化的標頭輸出函式庫,統一管理專案中的快取策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved