迁移到我的新服务器时遇到了一些奇怪的事情。
我有一个脚本会根据特定条件将用户重定向到另一个网页。然而,我正在做的是回显“重定向...”,然后使用header()函数实际重定向。以下是代码的外观:
if( $condition ) {
echo 'Redirecting...';
header( 'Location: ' . $url );
}
现在我只注意到切换到我们的新服务器后测试它是不正确的,并且看到它不会重定向输出重定向...一旦我搜索了它,就知道你不能有任何类型的在使用header()函数之前输出(除非使用ob_start等)。
问题是,为什么这个代码在任何PHP安装中不起作用,都可以在我的旧服务器上运行?它会在header()没有问题之前用echo重定向。
谢谢!
答案 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');
?>
相关链接:
ob_start()
用于在脚本中的任何位置手动启用输出缓冲的功能。header_sent()