我正在将一个正在运行的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“时,它们都忽略了Location头部,或者省略了Status头部,但当我将其改为"Status 303”时,它们进行了重定向。它在Apache下与状态200一起工作。
使用Location header是否需要Status header?或者Apache正在做一些其他的事情来使它工作?除了使其工作的header("Status: 303");行之外,我没有更改任何涉及到的php代码。一定有其他原因在起作用,但我不知道是什么原因。
有什么想法吗?
发布于 2010-11-11 09:48:58
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");
?>...Then,当然,您需要确保在发送了上面所示的HTTP/1.0...行之后仍然发送了Location头。
https://stackoverflow.com/questions/4150717
复制相似问题