【问题标题】:PHP if-statement ignored when header(Location: xxx) is inside当 header(Location: xxx) 在里面时 PHP if 语句被忽略
【发布时间】:2011-05-27 08:55:47
【问题描述】:

我有一个奇怪的问题。我的页面顶部有一个 if 语句,当 header(location: xxx) commmand 在其中时,它似乎被忽略了。

$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
}

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

奇怪的是,当我注释掉 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 时重定向到消息页面;

最后一个有趣的事情是我只在一台服务器上遇到了这个问题,同样的脚本在测试服务器上运行完美。

任何帮助将不胜感激!

【问题讨论】:

  • 对不起..不清楚发生了什么..?
  • 建议:在header();之后也写exit();
  • 添加了“exit;”重定向后(感谢您的建议),但这没有区别。
  • 虽然听起来很愚蠢,但您是否在 failing 服务器上创建了 var_dump($check)?
  • 按预期显示'bool(true)'

标签: php redirect header if-statement


【解决方案1】:

重定向到另一个页面后调用exit函数,否则下面的代码无论如何都会执行。

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】:

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

    试试这个方法:

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

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

    【讨论】:

    • 我不会首先提到更快和稳定作为参数,但事实上下面的所有代码仍将在标头解析之前执行。如果您不知道,这可能会导致意外行为。
    • 这是对的,但是只有浏览器会使用headers进行重定向,所以即使下面有内容,浏览器也不会获取它,通常会关闭连接,它只获取HEAD,检查所有内容,然后检查 BODY,但您是 100% 正确的,他应该始终考虑到这一点,因为它可能是私人数据。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      此类错误通常是由于在调用 header 函数之前向浏览器发送了内容。

      即使您认为自己不是在发送内容,如果您的文件在“

      即使在您“发送”了内容之后,输出缓冲也可以让您调用标头函数 - 这可能就是页面在一台服务器上运行而不是在另一台服务器上运行的原因。

      【讨论】:

        【解决方案5】:

        建议:

        • 在顶部写ob_start()

        • header();之后也写exit();

        • 按照一个答案的建议使用error_reporting(-1) 进行调试

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-13
            • 2014-03-04
            • 1970-01-01
            • 2020-03-05
            • 1970-01-01
            • 2018-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多