0

我在 php 中收到了这个警告:

Cannot modify header information - headers already sent by (output started at

当我分别安装 mysql、apache 和 php 时,但是当我使用 Wamp 时,警告不存在并且页面会优雅地重定向。

我已经尝试将错误报告设置为仅显示错误而不显示警告,发生的情况是警告没有显示,但页面也没有重定向。

我知道这已经被认为是不好的做法,但是我的代码库中有很多这样的代码,修改它们都可能会给代码带来新的错误。有什么办法可以完全忽略 php 中的这个警告?

4

5 回答 5

3

避免(而不是忽略)这个问题的经典方法是使用输出缓冲、ob_start() 和 ob_flush()。在任何输出之前开始缓冲,并显式地完成刷新,或者它可以自动完成。这会捕获任何输出而不是打印它,因此输出的任何标题都在任何可见内容之前完成。

从错误消息中的文件名修复输出的错误是解决此问题的最佳方法。?>在不需要时从文件中删除关闭的 ' ' 可能会有所帮助。

于 2012-04-13T09:54:57.660 回答
1

这是一种可怕的做法,但只是设置

error_reporting(0);

在脚本的开头。否则在 php.ini 中设置

display_errors = Off

编辑 - 可能你在重定向之前输出了一些东西。我曾经花了三天时间对此进行调试,原因有时是文件末尾的空格或您在重定向之前将一些 HTML 输出到浏览器的事实。
我通常从不关闭 php 标签以避免这种情况

于 2012-04-13T09:47:03.557 回答
1

即使你没有显示你的错误,你的应用程序也不会工作。这是因为就像错误所说的标头已经发送。这意味着以下内容:浏览器在服务器上请求您的 php 文件。然后服务器执行此操作并将生成的 html 发回。这个错误告诉你,在你已经发送了你的 php 文件的结果之后,你正在向浏览器发送一些东西。所以我建议你尝试修复你得到的错误,而不是不显示它。

于 2012-04-13T09:50:40.030 回答
1

您不能“忽略”此警告重定向。警告说得很清楚:

无法发送标题!标头已经通过输出发送!

这意味着标头(Location标头无法发送,因为输出已经发送。(标头只能在任何和所有输出之前发送)。

RTM,您需要修复您的错误,而不是忽略它们。


该错误是由您在调用函数之前发送某种输出引起的header(),其原因可能有很多,当意外时,直接怀疑是某个文件开头或结尾的空格。

 <?php //Note the space before the opening tag!
header("Location: this-will-fail.html");
?>
于 2012-04-13T09:51:21.880 回答
0

请注意,此错误准确地指明了您在代码中的哪个位置开始向浏览器输出数据(请参阅output started at ...1,查找尾随空格 \r、\n、制表符和空格)。理论上,关闭错误报告不会导致页面重定向,因为标头已经发送,因此无法更改或添加。

如果您需要使用已发送的数据进行重定向,您应该这样做:

if ( headers_sent() )    // Check if the headers were already sent
{
    echo( "<script>document.location.href='$url';</script>" );  // Use client side redirect
    die();  // Stop here
}
else
{
    header( "Location: $url" );  // Use server side redirect
}

但最好的办法是找出输出从哪里开始并修复它(如果可能的话)。

于 2012-04-13T09:54:19.610 回答