header()重定向的基本语法为Location(立即跳转)和Refresh(延迟跳转),核心限制包括:调用前不能有任何输出、需配合exit终止脚本、目标URL应为绝对路径;安全上须校验白名单并编码路径,避免开放重定向。

header()重定向的基本语法和核心参数
PHP 8.1 中 header() 函数本身没有新增参数,其重定向能力仍依赖标准 HTTP 响应头字段。最常用的是两个形式:
-
Location:实现立即跳转,格式为
header("Location: https://example.com"); -
Refresh:实现延迟跳转,格式为
header("Refresh: 3; url=https://example.com");,其中3表示等待秒数
这两个参数本质是 HTTP 响应头的键值对,不是 PHP 函数的“形参”。Location 是服务器端重定向的标准方式,浏览器收到后立刻发起新请求;Refresh 属于客户端刷新指令,兼容性好但非语义化重定向。
使用时必须注意的关键限制
header() 的行为高度依赖输出控制机制,以下限制在 PHP 8.1 中依然严格生效:
- 调用前不能有任何输出(包括空格、BOM、echo、print、HTML 标签、错误提示)
- 若启用了输出缓冲(ob_start),需确保缓冲未被冲刷(ob_flush/flush 未执行)
- header() 执行后,后续 PHP 代码默认继续运行 —— 必须手动终止,推荐用
exit;或die(); - 重定向目标 URL 应为绝对路径(如
https://site.com/path),相对路径在部分环境可能失效
安全跳转与 URL 构造建议
直接拼接用户输入到 Location 头中存在开放重定向风险。PHP 8.1 不提供自动过滤,需开发者主动防护:
立即学习“PHP免费学习笔记(深入)”;
- 只允许跳转到白名单域名,例如用
parse_url()提取 host 并比对 - 避免使用
$_SERVER['HTTP_REFERER']或$_GET['redirect']直接跳转 - 构造 URL 时,对路径部分用
rawurlencode()编码,而非urlencode()(后者会把空格转成 +) - 如需带 POST 数据跳转,header() 无法实现 —— 它仅触发 GET 请求,应改用表单自动提交或前端 JS 方案
替代方案与现代实践参考
虽然 header() 在 PHP 8.1 中完全可用,但实际项目中可结合新特性提升健壮性:
- 用 return 提前退出控制器逻辑,再统一做跳转,避免多处 exit 混乱
- 配合 array_is_list() 等 8.1 新函数做跳转前的数据校验(如判断目标路由是否有效)
- 在响应类中封装跳转方法,内置白名单检查、日志记录和 exit 控制
- API 场景下,不建议用 header("Location") 返回重定向,而应返回 302 状态码 + JSON 提示,由前端处理



















