代码之家  ›  专栏  ›  技术社区  ›  Mnebuerquo

对于nginx/php fpm,位置头有时被浏览器忽略。为什么?

  •  1
  • Mnebuerquo  · 技术社区  · 14 年前

    我正在将一个运行中的apache/mod php网站迁移到nginx/php fpm。

    在apache/mod php下,我可以使用 header("Location: $url"); 将浏览器重定向到其他页面,例如在尝试登录后。在切换到nginx/php fpm之后,浏览器将不再关注某些页面上的重定向。我与firebug和httpfox确认消息头“location:[url]”实际上是在响应中收到的。这种行为也出现在Chrome中(未在IE中测试)。

    所以我做了一些实验,读了一些关于HTTP的东西,并让它工作了,但是我不知道它为什么工作(或者为什么不工作)。

    我提出的解决方案是在“location:[url]”头之前发送一个“status:303”头。这在chrome和firefox中有效,当我发送“status:200”时,它们都忽略了位置头,或者忽略了状态头,但是当我将其更改为“status 303”时,它们进行了重定向。它在Apache下与状态200一起工作。

    使用位置标题是否需要状态标题?或者阿帕奇是在做其他事情来让它工作?除了 header("Status: 303"); 使它起作用的线条。这里肯定还有别的工作,但我不知道它可能是什么。

    有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Lee    14 年前

    这个 Location 头本身不会触发浏览器重定向。重定向实际上是由位于 3xx 系列。 w3c has explanations for all http response codes .

    阿帕奇自动看到 位置 响应中的头,如果以前没有设置自己的响应代码,则强制响应代码为300系列。nginx不这样做——它期望您自己设置正确的响应代码。

    您可以强制PHP发送修改后的HTTP响应代码,如下所示:

    <?php
      header("HTTP/1.0 301 Moved Permanently");
    ?>
    

    …那么,当然,你需要确保你仍然发送 位置 页眉 之后 发送 HTTP/1.0... 上面显示的行。