使用nginx / php-fpm,浏览器有时会忽略位置标题。为什么?

时间:2010-11-11 01:34:48

标签: php apache header nginx

我正在将一个正在运行的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,当我发送“状态:200”或省略状态标题时,它们都忽略了位置标题,但在我将其更改为“状态303”时进行了重定向。它与Apache下的Status 200一起使用。

使用Location标头需要Status标头吗?或者Apache是​​否正在做其他事情以使其工作?我没有更改任何涉及使其工作的header("Status: 303");行以外的PHP代码。这里必须有其他工作,但我不知道它可能是什么。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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");
?>

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