header()是PHP页面跳转最直接有效的方式,通过发送HTTP Location响应头实现服务端重定向,需在任何输出前调用并建议exit终止脚本。

header() 是 PHP 页面跳转最直接有效的方式
PHP 中实现页面跳转,header() 函数是标准且推荐的做法。它通过发送 HTTP Location 响应头触发浏览器重定向,速度快、无客户端依赖、不依赖 JavaScript。
关键前提是:必须在任何输出(包括空格、换行、)之前调用,否则会报错 Warning: Cannot modify header information - headers already sent。
- 确保脚本开头没有空格或 BOM 字符(尤其 Windows 编辑器保存时容易带 BOM)
- 避免在
header()前使用echo、print、var_dump或 HTML 内容 - 调用后建议紧跟
exit或die,防止后续代码继续执行
header('Location: https://example.com/login.php');
exit;为什么不能用 echo
用 echo 输出 JavaScript 跳转属于客户端跳转,本质是让浏览器执行脚本,不是真正的 HTTP 重定向。它在以下场景不可靠:
- 用户禁用 JavaScript 时完全失效
- 搜索引擎爬虫通常不执行 JS,SEO 友好性差
- 无法正确传递 HTTP 状态码(如 301/302),影响缓存与重定向语义
- 页面已部分渲染后再执行跳转,可能造成白屏或闪烁
仅当服务端跳转不可用(例如已输出内容且无法修改结构)时才作为兜底方案,且需加 exit 防止重复响应:
立即学习“PHP免费学习笔记(深入)”;
echo ''; exit;
301 和 302 状态码要手动指定吗?
header('Location: ...') 默认发送的是 302(临时重定向)。如果需要永久重定向(如 SEO 迁移旧 URL),必须显式设置状态码:
header('Location: https://example.com/new-page', true, 301);-
header('HTTP/1.1 301 Moved Permanently');+header('Location: ...')(顺序不能反)
注意:http_response_code(301) 单独调用不会自动加 Location 头,必须配合 header('Location: ...') 使用。漏掉状态码会导致搜索引擎误判为临时跳转。
header() 跳转后 $_POST / $_GET 数据会丢失吗?
会丢失。HTTP 重定向本质是浏览器发起一次**全新请求**,原请求的 $_POST、$_FILES 全部清空,只有 $_GET 参数可通过拼接 URL 保留:
- 跳转到带参数的 URL:
header('Location: success.php?status=ok&id=' . urlencode($id)); - 敏感数据(如密码、token)切勿拼在 URL 中,应改用
$_SESSION临时存储 - 表单提交后跳转(Post-Redirect-Get 模式)正是为了防止刷新重复提交,此时原本的 POST 数据本就不该被保留
如果强行想“保持 POST”,只能用 JavaScript 表单自动提交或 AJAX,但这已脱离纯 PHP 跳转范畴,且破坏 REST 语义。











