【问题标题】:PHP: Effect of code after header("Location: abc.html")PHP:标头后代码的效果(“位置:abc.html”)
【发布时间】:2011-04-29 15:06:07
【问题描述】:

比方说,代码看起来像这样:

if(!$test) {
  header("Location: somefile.html");
  ...some PHP code....
  header("Location: anotherfile.html");
}

上面的'一些PHP代码'被执行了吗?如果是,那么其中的进一步 HTTP 响应会发生什么(例如:代码中的第二个“标头”语句)?

【问题讨论】:

  • 它重定向到 somefile.html 并停止。但我很好奇后台发生了什么。
  • 你可以配置一些浏览器不跟随重定向,所以如果你用它来保护一个安全的页面,那么有人仍然可以访问这个页面......棘手

标签: php http


【解决方案1】:

是 - 代码将被执行。

header() 将配置要返回的标头,而不是立即发送它们。

  • 如果两者之间没有无输出 调用,那么只有最后一个会被 考虑在内。

  • 但是,如果您输出任何内容 在第二次通话之前,然后 将发送标头,第二个 调用将导致错误(标头 已发送)。

一个典型的错误是:重定向而不是exit(),这会导致安全问题。

【讨论】:

  • 好吧,重定向后跟 die()...正是我在做什么!
  • 那很好!我所做的是为此使用自制函数(名为redirect($url)),它将更改标题和退出。这样你就只用这个,不用header(),也不必担心忘记exit()。
【解决方案2】:

规则是在进行标头重定向时,在后面加上 exit:

if(!$test) {
  header("Location: somefile.html");
  exit;
  //wont ever run
  ...some PHP code....
  header("Location: anotherfile.html");
}

如果您不输入exit,则后面的代码可能会运行。

【讨论】:

    【解决方案3】:

    是的,“一些 PHP 代码”将运行。 Location 标头与任何其他标头一样。只有在脚本执行完毕后才能发送。因此,任何介于两者之间的代码,假设没有退出,必须在标题重要之前运行。

    【讨论】:

      【解决方案4】:

      其他一些代码被执行。

      header("位置:xxx");

      不会停止代码的执行。并且浏览器可能需要一些时间才能响应。

      【讨论】:

        【解决方案5】:
        header("Location: http://www.google.com");
        $test = "Hi!";
        header("Location: http://www.yahoo.com?t=" . $test);
        

        此代码将我的浏览器带到:http://www.yahoo.com/?t=Hi!

        【讨论】:

          【解决方案6】:

          header("location") 之后的代码被执行。如果你不想要,你应该使用exit(); :)

          重定向是顺便直接执行的,所以你可能看不到第一个header下面的东西的效果。

          【讨论】:

            猜你喜欢
            • 2022-01-18
            • 2013-09-15
            • 1970-01-01
            • 2014-03-05
            • 2020-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多