PHP header() 函数常见用法详解:301重定向、404状态与防缓存设置

夏知夏
夏知夏
发布时间:2026-10-14 | 4人浏览过
原创

PHP header() 函数用于在浏览器渲染前直接发送原始 HTTP 标头。通过调整参数,可实现 301 永久重定向、自定义 404/401 错误提示、控制浏览器缓存策略以及强制触发文件下载等功能。本文将结合具体场景展示标准代码写法及注意事项。

实现特定的 HTTP 状态码(301/404)

在处理 URL 跳转或页面异常时,明确告知服务器响应类型非常重要。以下针对不同场景提供标准代码:

第1步:设置 301 永久重定向

目的:通知搜索引擎和浏览器目标 URL 已永久移动,权重将转移至新地址。

操作:在脚本起始处执行以下 PHP 代码:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: $url"); // 替换为具体的目标 URL
exit;
?>

完成判断:浏览器或客户端接收到 301 状态码后,会自动向新的 $url 发起请求,且不会显示原页面内容。

第2步:自定义 404 “页面未找到”错误

目的:当逻辑上找不到资源但又不想暴露系统路径时,隐藏真实的 404 错误页。

操作:使用以下代码覆盖默认的 Apache/Nginx 404 响应:

<?php
header("HTTP/1.1 404 Not Found");
// 可选:随后 include 或 echo 自定义的错误页面 HTML
?>

注意:若配合 Nginx 的 error_page 404 指令,建议确保配置中使用的是 = 符号以正确重写 URI:
error_page 404 = /404.php;

第3步:验证失败时的 401 未授权状态

目的:要求用户输入凭证才能访问受保护区域。

操作:

<?php
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Restricted Area"');
?>

控制浏览器缓存行为

对于经常更新的数据或包含敏感信息的页面,必须强制客户端获取最新资料,防止代理服务器或本地缓存干扰。

第1步:添加过期时间与缓存控制标头

目的:从多个维度告诉浏览器不要缓存当前页面。

操作:依次发送以下四个标头:

  • 设置过期时间:设定一个过去的时间戳(如 1970年)。
  • 设置最后修改时间:设为当前时间。
  • Cache-Control:设置为不缓存。
  • Pragma:兼容 HTTP/1.0 协议的禁用缓存指令。
<?php
header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
?>

完成判断:刷新页面时,浏览器会再次向服务器请求数据而非读取本地副本。

强制文件下载与 MIME 类型设置

当希望用户不直接在浏览器打开文件,而是保存文件到本地磁盘时使用。

第1步:定义文件类型与内容处置

目的:指明即将输出的数据是附件形式,并指定文件名。

操作:

<?php
$filename = "document.pdf";
header("Content-Type: application/octet-stream"); // 通用二进制流
header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");
header("Content-Length: " . filesize($filename));
readfile($filename);
exit;
?>

重要参数:Content-Type 需根据实际文件类型调整(如 image/jpeg 或 application/pdf);Content-Disposition 中的 attachment 关键字决定了是否弹出下载框。

关键注意事项:避免输出前置

在使用 header() 时最容易遇到的错误是“Headers already sent”警告。这通常是因为在调用函数前输出了 HTML、空格或 BOM 字节。

  • 检查点:确保 PHP 文件的
  • 检查点:如果使用了 include() 引入其他文件,需确保被引入文件中没有意外输出。
  • 解决方案:若无法解决前置输出问题,可使用输出缓冲函数 ob_start() 将内容暂存于内存,待所有 header()ob_end_flush() 统一发送。

以上就是PHP header()函数的详细内容,更多关于PHP HTTP标头操作的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表