我正在将一个正在运行的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代码。这里必须有其他工作,但我不知道它可能是什么。
有什么想法吗?
答案 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...
标题。