【问题标题】:Headers are being sent although output already sent尽管输出已发送,但正在发送标头
【发布时间】:2023-03-27 10:15:01
【问题描述】:

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

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

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

为什么这段代码没有给出“HTTP headers already sent”的错误 还有其他方法可以打开输出缓冲吗?

编辑:

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

以上代码中没有包含文件

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

【问题讨论】:

  • 您是否启用了输出错误?是否执行重定向? (我怀疑)
  • 没有显示错误并不意味着完全没有错误 ;)
  • yes display_errors 设置为 On 并且正在执行重定向

标签: php


【解决方案1】:

你是对的,这应该行不通。

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

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

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

另外,检查是否真的发送了标头。您可以使用 wget 来做到这一点,例如:

wget -S http://example.com/

curl:

curl -v http://example.com/

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

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

【讨论】:

  • auto_prepend_file 和 auto_append_file 都没有在 phpinfo 设置值...请检查问题以进行编辑
【解决方案2】:

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

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

返回错误:

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

【讨论】:

  • @AbhishekAgarwal 尝试将error_reporting(E_ALL); ini_set("display_errors", 1); 添加到此文件的开头
【解决方案3】:

您可以使用headers_sent 函数检查是否和 where 标头已发送:

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

然后检查$filename

【讨论】:

    猜你喜欢
    • 2022-06-12
    • 2016-06-17
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多