【问题标题】:PHP - header("Location:") inside a function redirects without calling functionPHP - 函数内的 header("Location:") 重定向而不调用函数
【发布时间】:2010-01-22 00:19:20
【问题描述】:

我正在使用一个名为headerLocation() 的函数来正确重定向。 这是函数的相关部分,我使用它来重定向,然后显示适当的消息(个人偏好)。

function headerLocation($location,$message)
{
    $_SESSION['output'] = $message;
    header("Location: ". $location);
}

问题是,当我运行脚本时,header("Location: ". $location); 部分被激活,甚至没有调用函数(当我最初需要它进行 php 解析时)。 这会使函数变得无用。

有没有办法解决这个问题?

【问题讨论】:

  • 在某处必须调用headerLocationheader。声明时不调用函数。

标签: php redirect header


【解决方案1】:

除了已经给出的反馈。重定向后exit 是个好主意。

function headerLocation($location,$message)
{
    $_SESSION['output'] = $message;
    header("Location: ". $location);
    exit;
}

【讨论】:

  • 我花了 1 个小时才意识到为什么某些函数在“header('Location:index.php');”之后一直调用直到我读到这条评论。添加退出后,不再出现错误。谢谢
【解决方案2】:

那不应该发生。您正在在某处调用该函数,或者代码的另一部分正在写出标题。你能在那个函数中添加一些调试来检查吗?

【讨论】:

    【解决方案3】:

    只是一个猜测,也许你应该缓冲你的输出( ob_start() ) 这将导致仅在刷新输出时发送标头,从而允许执行其余代码。

    【讨论】:

      【解决方案4】:

      header() 函数在不先调用 headerLocation() 的情况下进行重定向是没有意义的。

      我的猜测是你没有看到$_SESSION['output'] 持有$message,这让你认为函数没有被执行。尝试写入一个新文件,这行得通吗?我打赌它会的。

      $_SESSION 可能没有保留您的值的原因可能是因为P3P 和您的浏览器和/或 PHP 配置。

      Also, are you sure you don't wanna call die() / exit() after the header() redirect?

      【讨论】:

      • 正如我所说,这只是功能的一部分。我并不困惑,这不是因为 $message。
      • @Gal:是什么让你认为headerLocation() 没有被执行?
      • 好的,我禁用了一个对 mysql 函数的调用,它运行良好。那就是问题所在。我会努力解决的。
      • @Gal:那是不可能的,再次检查你的代码,仔细检查以确保你得到正确数量的左括号和右括号等等......
      • Alix Axel 谢谢,你确实是对的。 mysql 函数内部有一个隐藏的重定向。
      【解决方案5】:

      重定向发生得太快,无法正确写入 $_Session。使用

      session_write_close();
      

      在标头调用之前。

      编辑:删除函数调用前面的可笑 $。

      【讨论】:

      • 我认为这不是 OP 的要求。我相信OP想知道为什么在没有调用headerLocation函数的情况下执行header()调用。
      • 不,他提到 header() 被调用所以 headerLocation() 被调用,前面的行只是没有被执行,因为线程在 $_SESSION 可以更新之前被破坏。如果他的函数没有被调用,重定向将永远不会发生。强制会话在它可以移动到下一个指令之前写入会导致线程暂停足够长的时间以在标头被推出和重定向之前完成。
      • 虽然我绝对同意您提出的安全预防措施,但我认为您可能需要再次阅读该问题。 ;-)
      • ... 并重写您的代码,使其不会调用名称为名为“session_write_close”的变量内容的函数;-)
      猜你喜欢
      • 2011-12-17
      • 2012-11-17
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多