繁体   English   中英

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

[英]Headers are being sent although output already sent

据我所知,发送输出后无法发送HTTP标头,唯一的解决方法是使用输出缓冲

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

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

为什么此代码没有为“ HTTP标头已发送”提供错误信息?是否有另一种方式打开输出缓冲?

编辑:

我正在使用wamp在我的本地主机上运行它

上面的代码中没有文件

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

您是对的,这不起作用。

首先,您确定标头已写入,还是只是想知道为什么没有显示错误消息? 也许错误报告已关闭? 在这种情况下,请尝试提高错误报告级别:

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

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

另外,请检查标题是否确实已发送。 您可以使用wget做到这一点,例如:

wget -S http://example.com/

curl

curl -v http://example.com/

您也可以在Chrome开发者控制台中查看HTTP标头。 在其他浏览器中也很有可能。

如果标题是真的发送的,那么关于输出缓冲的地方可能有些不可思议。 您是在本地还是在远程主机上运行它? 如果这不是您的主机,则可能是提供商已对此进行设置。 PHP具有自动添加和添加自定义代码的功能。 检查php.iniauto_prepend_fileauto_append_file设置。 可能有一些ob_start()等隐藏。 您可以通过调用phpinfo()ini_get()特定的一种来查看所有PHP设置。

您没有看到错误,因为启用了输出缓冲。 试试这个代码:

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

返回错误:

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

您可以使用headers_sent函数检查是否以及在何处发送了标头:

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

然后检查$filename

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM