在 PHP 中,header() 函数用于发送原始的 HTTP 头部信息,比如重定向、设置 cookie、修改内容类型等。然而,HTTP 头部信息必须在任何实际输出(如 HTML、echo、print 等)之前发送,否则会引发错误。这是因为一旦输出开始,PHP 会自动发送 HTTP 头部。
为了避免调用 header() 时出错,我们可以使用 headers_sent() 函数来检测头部是否已经发送。
headers_sent() 是 PHP 提供的一个内置函数,用来检查是否有 HTTP 头部信息已经发送到浏览器。它的基本用法如下:
if (!headers_sent()) {
header('Location: https://m66.net/some-page');
exit;
}
如果头部还没有发送,headers_sent() 返回 false,表示可以安全地调用 header();如果返回 true,说明头部已经发送,再调用 header() 就会报错。
headers_sent() 还可以接受两个参数,用来获取头部输出的位置(文件和行号):
if (headers_sent($file, $line)) {
echo "HTTP 头部已在 $file 文件的第 $line 行发送。";
} else {
header('Location: https://m66.net/some-other-page');
exit;
}
这种方式特别适合调试,帮助你找到提前输出的代码位置。
在进行重定向之前,你应该确保没有任何输出:
if (!headers_sent()) {
header('Location: https://m66.net/login');
exit;
} else {
echo "无法重定向,因为已经有输出。";
}
同样,setcookie() 依赖 HTTP 头部,因此也要检查:
if (!headers_sent()) {
setcookie('user', 'JohnDoe', time() + 3600, '/');
} else {
echo "无法设置 cookie,因为头部已发送。";
}
如果你经常遇到头部发送错误,可以考虑在脚本开头启用输出缓冲:
ob_start();
这样所有输出会先进入缓冲区,而不是立刻发送给浏览器,直到脚本结束或调用 ob_end_flush(),给你留出更多时间来安全地发送头部信息。