尽管输出已经发送,但正在发送标头

时间:2015-02-11 08:30:17

标签: php

据我所知,在输出发送后无法发送HTTP标头,只有解决方法才能使用输出缓冲

但我的PHP脚本即使在发送输出后也能发送标题。 这是我的代码

Text output already sent
<?php
header('Location: test2.php');
die();
?>

为什么此代码没有为&#34;已发送的HTTP标头提供错误&#34; 还有另一种方法可以打开输出缓冲吗?

编辑:

我使用wamp

在我的localhost上运行它

上述代码中没有包含任何文件

我刚注意到phpinfo()中的outbut_buffering指令设置为1 但是当我在php.ini文件中检查它时,它被设置为Off

3 个答案:

答案 0 :(得分:2)

你是对的,这应该不起作用。

首先,您确定要编写标题,还是只是想知道为什么没有显示错误消息?可能关闭了错误报告?在这种情况下,请尝试增加错误报告级别:

error_reporting(E_ALL);
ini_set("display_errors", 1);

完成调试后,从代码中删除它。错误应记录到日志文件中,永远不会在生产环境中显示!

另外,检查标头是否确实已发送。您可以使用wget执行此操作,例如:

wget -S http://example.com/

curl

curl -v http://example.com/

您还可以在Chromes开发人员控制台中查看HTTP标头。在其他浏览器中也很可能。

如果真的发送了标题,那么就可能存在一些关于输出缓冲的魔力。您是在本地还是在远程主机上运行?如果这不是您的主机,则可能是提供商已设置此权限。 PHP具有自动添加和附加自定义代码的功能。查看auto_prepend_fileauto_append_filephp.ini设置。可能会隐藏一些ob_start()等。您可以通过调用phpinfo()或使用ini_get()特定的一个来查看所有PHP设置。

答案 1 :(得分:1)

由于启用了输出缓冲,因此您看不到错误。试试这段代码:

<?php
ob_end_clean();
?>
Text output already sent
<?php
header('Location: test2.php');
die();
?>

它返回错误:

  

文本输出已发送警告:无法修改标题信息 -   标题已由

发送

答案 2 :(得分:1)

您可以使用headers_sent功能检查是否以及哪里标头已发送:

if (!headers_sent($filename, $linenum)) {
    header('Location: test2.php');
    exit;
} else {
    echo 'Headers sent from '. $filename;
}

然后查看$filename