【问题标题】:Able to Echo before header()能够在 header() 之前回显
【发布时间】:2011-04-04 06:47:27
【问题描述】:

在迁移到我的新服务器时遇到了一些奇怪的事情。

我有一个脚本可以根据特定条件将用户重定向到另一个网页。然而,我正在做的是回显“重定向...”,然后使用 header() 函数实际重定向。以下是代码的外观:

if( $condition ) {
    echo 'Redirecting...';
    header( 'Location: ' . $url );
}

现在我只是在切换到我们的新服务器后才注意到这是不正确的,对其进行了测试,发现它不会重定向只是输出重定向......并且一旦我搜索它,得知你不能拥有任何类型的在使用 header() 函数之前输出(除非使用 ob_start 等)。

问题是,为什么这段代码不能在任何 PHP 安装中运行,但在我的旧服务器上运行?它会在 header() 之前使用 echo 重定向没有问题。

谢谢!

【问题讨论】:

  • 我相信你可以在你的 php.ini 中默认开启输出缓冲。缺点是整个请求必须在任何输出发送给用户之前完成。

标签: php redirect header


【解决方案1】:

它在您的旧服务器上工作,因为您在默认情况下启用了输出缓冲,由 php.ini 设置。

【讨论】:

    【解决方案2】:

    也许您的旧安装在 php.ini 中将 output_buffering 定义为 true。这会延迟输出,即使在回显之后也可以设置标题。

    【讨论】:

      【解决方案3】:

      您可能在旧服务器上启用了输出缓冲:在脚本完成运行之前,输出缓冲不会输出任何内容。这允许它在实际输出之前获取标头(因为它知道应该首先发送标头)。

      如果有道理的话。

      【讨论】:

      • 谢谢!这似乎是刚刚检查旧服务器上的 php.ini 的问题,并且 output_buffering 设置为 4096,所以它在 :)
      【解决方案4】:

      您一定已经打开了缓冲,即使您自己并没有主动这样做。 output_buffering = On 在 php.ini 中?

      【讨论】:

        【解决方案5】:

        旧服务器可能默认启用了输出缓冲。这意味着它不会马上echo,而是等到整个脚本完成,然后再echo。这也意味着标头将在 echo 之前发送(因为它已被缓冲),因此不会导致警告。

        在新服务器上,您很可能默认没有启用输出缓冲,这意味着它会立即echo,而不缓冲它,因此它将在标头之前发送并导致警告。

        我鼓励您使用headers_sent()echo 之后使用headers() 之前检查标头是否已发送,如下所示:

        <?php
        echo "Foobar\n";
        if(!headers_sent())
          header('Location: /helloworld.php');
        ?>
        

        相关链接:

        【讨论】:

        • 感谢您的帮助我很感激:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多