该错误是因在header()等函数前已有内容输出所致,主因包括bom头、标签前后空白、提前echo及session_start()前置输出;解决方法为保存为utf-8无bom、删除多余空白、确保输出语句后置、使用ob_start()缓冲或彻底修复源头。

这个问题是因为在调用 header()、session_start()、setcookie() 等函数前,已经有实际内容(比如空格、换行、HTML、echo 输出)发送到了浏览器,导致 HTTP 响应头无法再被修改。
常见原因和对应解决方法
1. 文件开头或结尾存在不可见字符
UTF-8 编码的 PHP 文件如果带 BOM(Byte Order Mark),会在文件最开头插入三个隐藏字节(EF BB BF),PHP 会把它当作输出内容,从而触发该错误。
- 用编辑器(如 VS Code、Notepad++)将文件另存为「UTF-8 无 BOM」格式
- 检查所有被
include或require的文件(尤其是配置文件、函数库),它们同样不能带 BOM
2. PHP 标签前后有多余空白或换行
以下写法看似无害,实则会在响应中输出换行:
<?php // some code ?><!-- 这里换行会被输出 -->
- 避免在
<?php前、?>后添加任何空格、Tab 或换行 - 推荐统一使用
<?php开头,不写... ?>短标签,也不写<?php ... ?>闭合后还跟 HTML - 如果文件纯 PHP(无 HTML 输出),可省略
?>结尾,彻底避免尾部空白问题
3. 提前执行了输出语句
例如在 header("Location: ...") 前不小心写了 echo、print、var_dump,甚至调试时的 die("test")。
- 检查逻辑顺序:确保所有
header()调用都在任何输出之前 - 临时注释掉疑似输出的代码,逐步排查
- 启用错误报告(
error_reporting(E_ALL); ini_set('display_errors', 1);)有助于定位哪一行先输出
临时绕过(仅限调试,不推荐上线)
可通过 ob_start() 开启输出缓冲,把本该直接发送的内容暂存起来,等脚本结束前统一处理:
<?php ob_start(); // 必须放在第一行、任何输出之前
// 后续可安全调用 header()、session_start() 等
header("Location: /login.php");
exit;
- 注意:
ob_start()本身也必须是脚本第一个有效语句,前面不能有任何输出(包括空格) - 缓冲会增加内存开销,生产环境建议从根源修复,而非依赖缓冲
检查 session_start() 的特殊性
session_start() 内部会自动发送 Set-Cookie 头,因此它同样受“不能有前置输出”限制。常见陷阱:
-
session_start()前引入了带输出的配置文件(如config.php中有echo "loaded";) - 开启了
session.auto_start = 1(php.ini 中),导致会话在脚本开始时自动启动,此时连空白都不可容忍 - 解决方法:确认所有前置文件纯净;如需自动开启 session,优先改用显式
session_start()并严格控制位置
核心原则就一条:header 相关操作必须是脚本中最早发生的输出行为。只要守住这个边界,问题基本不会出现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











