當前位置: 首頁> 最新文章列表> 防止緩存:Cache-Control 和Pragma 的設置技巧

防止緩存:Cache-Control 和Pragma 的設置技巧

M66 2025-05-28

在Web 開發中,有時候我們需要確保瀏覽器或代理服務器不要緩存我們的頁面,以便用戶每次訪問時都能獲取到最新的內容。 PHP 提供的header()函數可以用來發送HTTP 頭部,從而控制緩存行為。本文將詳細介紹如何使用header()函數設置Cache-ControlPragma ,以有效防止緩存。

1. 為什麼需要防止緩存?

瀏覽器緩存是為了提升性能、減少服務器壓力而設計的,但在某些場景下(如:動態數據、用戶個人信息、敏感操作頁面等),我們需要強制瀏覽器每次都從服務器獲取最新內容,而不是從緩存中加載。

如果沒有正確設置緩存控制,用戶可能會看到過期的頁面,導致數據不一致或操作錯誤。

2. 使用header() 函數發送HTTP 頭

PHP 的header()函數允許你向瀏覽器發送原始的HTTP 頭信息,必須在任何輸出(echo、print、HTML)之前調用。

3. 設置Cache-Control

Cache-Control是HTTP/1.1 引入的重要頭部,用來定義緩存策略。要禁止緩存,可以使用如下指令:

  • no-store : 不允許任何緩存。

  • no-cache : 每次都必須重新驗證。

  • must-revalidate : 必須向服務器確認過期資源。

示例代碼:

 <?php
// 禁止緩存
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
?>

這裡的第二個header()調用, false參數表示不要覆蓋前一個同名頭,而是追加。

4. 設置Pragma

Pragma是HTTP/1.0 中的舊方法,用於兼容老舊的代理服務器。

示例代碼:

 <?php
header("Pragma: no-cache");
?>

雖然現在主要使用Cache-Control ,但為了兼容性,建議一併添加Pragma: no-cache

5. 設置Expires

除了Cache-ControlPragma ,還可以設置Expires頭,將過期時間設置為過去的某個時間點,強制內容失效。

示例代碼:

 <?php
header("Expires: Thu, 01 Jan 1970 00:00:00 GMT");
?>

6. 完整示例

以下是一個完整的防緩存示例:

 <?php
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Expires: Thu, 01 Jan 1970 00:00:00 GMT");

// 假設輸出動態內容
echo "<html><body>";
echo "<h1>當前時間: " . date('Y-m-d H:i:s') . "</h1>";
echo "<p>訪問 <a href=\"https://m66.net/demo\">m66.net 示例頁面</a></p>";
echo "</body></html>";
?>

7. 注意事項

  • 必須在發送任何輸出之前調用header() ,否則會引發“headers already sent”錯誤。

  • 不同瀏覽器和代理服務器對緩存指令的支持略有差異,為了保險,最好同時設置Cache-ControlPragmaExpires

  • 如果你使用了緩存插件或CDN,可能還需要在這些層級上配置防緩存策略。