能够在标题之前进行回声()

时间:2010-08-26 13:30:47

标签: php redirect header

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

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

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

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

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

谢谢!

5 个答案:

答案 0 :(得分:10)

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

如果这是有道理的。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

你必须打开缓冲,即使你自己没有主动这样做。 php.ini中的output_buffering = On

答案 3 :(得分:1)

它在您的旧服务器上运行,因为您默认启用输出缓冲,由php.ini设置。

答案 4 :(得分:0)

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

在新服务器上,您很可能默认情况下没有启用输出缓冲,这意味着它会立即echo,而不会缓冲它,因此它会在标题和结果之前发送警告。

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

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

相关链接: