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

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

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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。