PHP header already sent:中文乱码、BOM、空格导致的全套解决方案(图文版)

你是不是也遇到过这个经典报错:

vbnet 复制代码
Warning: Cannot modify header information - headers already sent by...

中文名就叫:

"还没来得及发 HTTP 头,你就先输出东西了"

别慌,这绝对不是大问题,但也是 PHP 新手最容易踩的坑。

今天我用最简单的方式,带你把这个问题彻底讲懂。


1⃣ 这个错误到底什么意思?

一句话解释:

你调用 header()setcookie()session_start() 之前,

代码里已经"悄悄输出了一些东西"。

这些"输出"可能是:

  • 一个看不见的空格
  • 一个回车符
  • 隐藏的 BOM 字节
  • 你自己 echo/var_dump 的内容
  • 引入文件里的输出

只要有一点点输出,header 就会报错。


2⃣ 最常见的罪魁祸首:UTF-8 BOM

很多编辑器默认保存为"UTF-8 BOM",而 PHP 最怕 BOM。

BOM 会在文件最开头偷偷输出三个字节:

复制代码
EF BB BF

你看不见,但服务器能看到。

于是服务器说:

"啊你已经输出了,我就不能设置 header 了。"


✔ 如何判断文件是不是 BOM?

症状明显:

  • 中文突然乱码
  • header 报错特别早
  • 新建文件使用过 Windows 记事本 / Dreamweaver

✔ 如何去掉 BOM?

VSCode

右下角 → 点击"UTF-8" → 选择 UTF-8(无 BOM) 保存即可。

Notepad++

菜单 → 格式 → 选择 UTF-8(无 BOM)

宝塔面板编辑器 / PHPStorm

默认不会带 BOM,比较安全。


3⃣ 第二大元凶:文件顶部的空格 + 回车

PHP 文件头部常见两种错误:

❌ 错误写法 1:

php 复制代码
(空格)(空格)
<?php

❌ 错误写法 2:

php 复制代码
<?php

// 顶部多了一行空行

这两个都会导致 header 报错。


✔ 正确写法

php 复制代码
<?php

第一行第一列必须是 <?php,上面不能有任何内容。

记住:
空格也算输出!回车也算输出!


4⃣ 第三类:你自己输出的调试信息

最容易忘的情况:

scss 复制代码
var_dump($data);  
header("Location: /index.php");

你调试一下忘记删了,header 直接挂掉。

其它输出包括:

  • echo
  • print
  • print_r
  • die
  • exit

都要检查一遍。


5⃣ include/require 的文件里也可能有输出

主文件可能没问题,但你这样写:

javascript 复制代码
require 'config.php';
header("Location: xxx.php");

只要 config.php 有:

  • BOM
  • 空格
  • echo
  • HTML

都会导致 header 报错。

记得 所有被引入的文件也要检查


6⃣ 万能解决方案:输出缓冲(最稳)

如果你实在搞不清哪里输出了,可以直接使用:

scss 复制代码
ob_start();

把它放在所有代码最上方。

PHP 会把所有输出暂存,

等你把 header / cookie / session 都设置完,

再统一输出。


7⃣ 最稳定推荐写法(复制就能用)

php 复制代码
<?php
ob_start();
session_start();
header("Content-Type: text/html; charset=utf-8");

// 你的逻辑...

这套写法能避免 99% 的 "header already sent"。

9⃣ 最后给你一个超实用排查顺序(收藏版)

  1. 检查文件顶部是否有空格/空行
  2. 转成 UTF-8 无 BOM
  3. 搜索所有 output(echo/print/var_dump)
  4. 检查 include 的文件
  5. 统一加 ob_start()
  6. 不行再检查 CDN 或 gzip(非常少见)

按这顺序查,10 分钟必解决。

相关推荐
BingoGo1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
longxiangam4 天前
Composer 私有仓库搭建
php·composer
上海云盾-高防顾问4 天前
DNS异常怎么办?快速排查+解决指南
开发语言·php