当header(Location:xxx)在里面时,忽略PHP if语句

时间:2011-05-27 08:55:48

标签: php redirect header if-statement

我有一个奇怪的问题。页面顶部有一个if语句,当标题(位置:xxx)命令在其中时,似乎被忽略。

$check = $authorisation->check(); 
// i know this results in true by echoing the value 
// (you've got to believe me on this one)

if(!$check){
    // redirect to message
    header("Location: message.php");
    exit;

}else{
    // do nothing, continue with page
}

这总是重定向到message.php页面,无论$ authorisation-> check()的结果是什么!

奇怪的是,当我注释掉header-command,并将echo放在if语句中进行验证时,一切正常:

    $check = $authorisation->check(); // true
    if(!$check){
        // redirect to message
        echo "you are not welcome here";
    }else{
        echo "you may enter";
    }

结果是“你可以进入”;

这也符合预期:

    $check = true;
    if(!$check){
        // redirect to message
        header("Location: message.php");
        exit;

    }else{
        // do nothing
    }

这仅在$ check = false;

时重定向到消息页面

最后一件有趣的事情是我只在1台服务器上遇到问题,同样的脚本在testserver上完美运行。

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:4)

在完成标题后,您应该始终运行exit,以便浏览器的传输速度更快,更稳定。

尝试这种方式:

if( ... )
{
     header("Location: message.php");
     exit;
}

// ...

请阅读其他提示的评论,了解为什么这是一个好主意。

答案 1 :(得分:4)

重定向到另一个页面后调用退出功能,否则无论如何都会执行以下代码。

if(!$check){
  // redirect to message
  header("Location: message.php");
  exit;
}else{
  // do nothing, continue with page
}
// the following code will be executed if exit is not called
...

答案 2 :(得分:2)

尝试放error_reporting(-1);你会看到新的东西。在您的一台服务器上,PHP错误报告设置为较低级别。

答案 3 :(得分:2)

这种错误通常是由调用头函数之前发送到浏览器的内容引起的。

即使您认为自己没有发送内容,如果您的文件以“<?php”之前的空格或空白行开头,那么您将遇到错误 - 这通常是一个非常微妙的注意事项/发现。

即使你已经“发送”了内容,输出缓冲也可以让你调用标题函数 - 这可能就是为什么页面在一台服务器而不是另一台服务器上工作的原因。

答案 4 :(得分:0)

<强>建议:

  • 在顶部写下ob_start()

  • 还在header();

  • 之后写下exit();
  • 按照一个答案

  • 中的建议调试error_reporting(-1)

答案 5 :(得分:0)

我遇到了同样的问题,你在代码中的其他地方调用了header('Location:blahblah')。检查一下。