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

我正在将一个可正常运行的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正在做其他事情来使其工作?除了标题(“ Status:303”)之外,我没有更改任何涉及的php代码;使其工作的线.这里必须要有其他工作,但是我不知道这可能是什么.

有任何想法吗?

最佳答案
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 / php-fpm时,浏览器有时会忽略位置标头.为什么? - 代码日志