当前位置: 首页> 最新文章列表> 防止缓存: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,可能还需要在这些层级上配置防缓存策略。