“headers already sent”错误源于header()前已有输出,解决步骤:一、移除BOM;二、清除空白字符;三、启用ob_start()缓冲;四、分离逻辑与HTML输出;五、关闭错误显示并修复警告。

如果您在网页中嵌入 PHP 链接时出现“headers already sent”错误,通常是由于在调用 header() 函数之前已向浏览器输出了任何内容。以下是解决此问题的步骤:
一、检查并移除 BOM 签名
BOM(Byte Order Mark)是 UTF-8 文件开头可能存在的不可见字符,会导致 PHP 在输出任何内容前就发送 HTTP 头信息。
1、使用支持显示 BOM 的编辑器(如 Notepad++ 或 VS Code)打开 PHP 文件。
2、在 Notepad++ 中点击“编码”菜单,确认当前编码为UTF-8 无 BOM。
立即学习“PHP免费学习笔记(深入)”;
3、若显示为“UTF-8 with BOM”,则选择“转为 UTF-8 无 BOM”并保存文件。
4、重新上传该 PHP 文件至服务器并测试是否仍报错。
二、排查空白字符与不可见输出
PHP 脚本开头或结尾的空格、换行符、空行,以及 HTML 标签前的空白,均会在 header() 执行前触发输出缓冲,导致错误。
1、打开 PHP 文件,将光标置于第一行第一个字符前,确认无空格或空行。
2、检查文件末尾,确保 ?> 之后没有任何字符(包括空格、制表符、换行符)。
3、若文件仅含 PHP 代码,建议直接删除结束标签 ?>,避免意外输出。
4、逐行检查 include 或 require 引入的文件,确保所有被包含文件也符合上述要求。
三、启用输出缓冲控制
通过开启 PHP 输出缓冲,可将脚本中所有输出暂存于内存,延迟发送至浏览器,从而允许后续 header() 正常执行。
1、在 PHP 文件最顶部(第一行且无任何空行或字符)添加:ob_start();
2、在需要发送 header 的位置前,确保尚未调用 ob_end_flush() 或类似函数。
3、若需手动清空缓冲区并发送内容,可在 header() 后使用 ob_end_flush();。
4、注意:不建议在所有文件中无差别启用 ob_start(),应仅用于修复明确存在输出冲突的场景。
四、分离逻辑与输出
将 header() 相关跳转、重定向等逻辑置于纯 PHP 处理段,严格禁止其与 HTML 输出混写在同一文件中。
1、创建独立的处理脚本(如 login_check.php),仅含 PHP 逻辑与 header() 调用,不包含任何 HTML、echo 或空行。
2、在前端页面中使用 form action 或 AJAX 提交至该脚本,而非内联嵌入。
3、若必须嵌入,改用 JavaScript 重定向:window.location.href = 'target.php'; 替代 PHP header()。
4、检查所有 error_reporting 设置,确保未开启 E_NOTICE 或 E_WARNING 导致警告信息提前输出。
五、验证 PHP 配置与错误报告级别
部分服务器配置会将 PHP 警告或 Notice 显示为实际输出,干扰 header 发送时机。
1、在出错脚本顶部添加:error_reporting(0); 临时屏蔽所有错误输出。
2、若错误消失,说明有未捕获的警告(如 undefined index)正在输出内容。
3、定位具体警告位置,使用 isset() 或 null 合并操作符(??)进行变量安全访问。
4、检查 php.ini 中 display_errors = Off 是否生效,生产环境严禁开启 display_errors。











