【问题标题】:With nginx/php-fpm, location header sometimes ignored by browser. Why?使用 nginx/php-fpm,位置标头有时会被浏览器忽略。为什么?
【发布时间】:2011-05-08 05:37:45
【问题描述】:

我正在将一个正常工作的 apache/mod-php 网站迁移到 nginx/php-fpm。

在 Apache/mod-php 下,我可以使用 header("Location: $url"); 将浏览器重定向到不同的页面,例如在登录尝试之后。切换到 nginx/php-fpm 后,浏览器将不再遵循某些页面上的重定向。我通过 Firebug 和 Httpfox 确认响应中实际上收到了标题“Location: [url]”。此行为也出现在 Chrome 中(未在 IE 中测试)。

所以我做了一些实验,阅读了一些关于 http 的东西,并使它工作,但我不确定它为什么工作(或为什么没有工作)。

我想出的解决方案是在“位置:[url]”标头之前发送“状态:303”标头。这适用于 Chrome 和 Firefox,当我发送“状态:200”或省略状态标题时,它们都忽略了位置标题,但是当我将其更改为“状态 303”时进行了重定向。它适用于 Apache 下的 Status 200。

使用 Location 标头是否需要 Status 标头?或者 Apache 是否正在做其他事情来使其工作?除了使它工作的header("Status: 303"); 行之外,我没有更改任何涉及的php 代码。这里肯定有其他东西在起作用,但我不知道它可能是什么。

有什么想法吗?

【问题讨论】:

    标签: php apache header nginx


    【解决方案1】:

    Location 标头本身不会触发浏览器重定向。重定向实际上是由3xx 系列中的 HTTP 响应代码触发的。 w3c has explanations for all http response codes.

    Apache 会自动在响应中看到 Location 标头,如果您之前没有设置自己的响应代码,则强制响应代码为 300 系列。 Nginx 不会这样做——它希望您自己设置正确的响应代码。

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

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

    ...那么,当然,您需要确保在发送上面显示的HTTP/1.0... 行之后仍然发送您的Location 标头。

    【讨论】:

    • 您的代码行丢失了,但我明白现在发生了什么。谢谢你的解释。
    • 有没有办法强制 nginx 像 Apache 一样工作?我面临着类似的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2020-04-04
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多