PHP 7.4 中 header("Location: ...") 失败主因是 BOM 或空白字符提前输出导致响应头已发送;需清除 UTF-8 BOM、省略 ?> 标签、禁用 display_errors,并用 headers_sent() 定位问题文件行,重定向后必须 exit。

PHP 7.4 中 header("Location: ...") 重定向失败,绝大多数情况是因 BOM 或空格提前触发了 HTTP 输出——只要响应头已发送,header() 就彻底失效,且不会报错(仅在错误报告开启时显示警告),浏览器会静默忽略该头,导致页面“卡住”或显示空白。
检查并清除 UTF-8 BOM
BOM(EF BB BF)是隐藏在 PHP 文件最开头的三个字节,常见于 Windows 编辑器(如记事本、旧版 Notepad++)保存 UTF-8 文件时自动添加。它虽不可见,但会被 PHP 当作真实输出,直接破坏 header() 调用前提。
- 用 VS Code 打开文件 → 右下角点击编码(如“UTF-8”)→ 选择【Save with Encoding】→ 【UTF-8 without BOM】
- 命令行批量清除(Linux/macOS):
find . -type f -name "*.php" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \; - PowerShell 清除(Windows):
$files = Get-ChildItem -Recurse -Filter "*.php"; foreach ($f in $files) { $b = Get-Content $f.FullName -Raw -Encoding Byte; if ($b[0] -eq 0xEF -and $b[1] -eq 0xBB -and $b[2] -eq 0xBF) { [System.IO.File]::WriteAllBytes($f.FullName, $b[3..($b.Length-1)]) } }
杜绝所有隐式输出
除了 BOM,任何位置的空白字符都可能惹祸,尤其容易被忽略的是文件末尾和包含文件中:
- 所有 PHP 文件统一省略
?>结束标签(PHP 官方推荐),从根源上避免?>后多出换行或空格 - 检查所有
include/require的配置文件(如config.php、db.php),确保它们开头无 BOM、结尾无空行或空格 - 禁用
display_errors:哪怕只是 Notice 级错误,只要display_errors = On,就会变成实际输出。加一行ini_set('display_errors', '0');到脚本开头
定位问题源头的实用方法
别靠猜,用 PHP 自带函数快速锁定哪行、哪个文件先输出了内容:
立即学习“PHP免费学习笔记(深入)”;
- 在调用
header()前插入:if (headers_sent($file, $line)) { die("Headers already sent in $file on line $line"); } - 该代码会立即终止执行,并明确告诉你:是
config.php第 12 行?还是index.php第 2 行?精准缩小排查范围
变量与路径必须正确书写
即使没有输出问题,语法错误也会让重定向“看似成功实则 404”:
- 不要用单引号写变量:
header('Location: $url')→ 实际发送的是字面量$url,浏览器找不到该路径 - 改用拼接:
header('Location: ' . $url);(更安全)或双引号:header("Location: $url"); - 路径建议用绝对路径:
/contact/success.php或完整 URL:https://yoursite.com/contact/success.php,避免相对路径解析歧义 - 重定向后必须跟
exit;或die();,否则后续代码仍会执行,可能产生意外输出



















