[英]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.ini
的auto_prepend_file和auto_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.