据我所知,在输出发送后无法发送HTTP标头,只有解决方法才能使用输出缓冲
但我的PHP脚本即使在发送输出后也能发送标题。 这是我的代码
Text output already sent
<?php
header('Location: test2.php');
die();
?>
为什么此代码没有为&#34;已发送的HTTP标头提供错误&#34; 还有另一种方法可以打开输出缓冲吗?
编辑:
我使用wamp
在我的localhost上运行它上述代码中没有包含任何文件
我刚注意到phpinfo()中的outbut_buffering指令设置为1 但是当我在php.ini文件中检查它时,它被设置为Off
答案 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_file和auto_append_file的php.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
。