作者:故事里的说书人 | 来源:互联网 | 2023-05-19 08:22
我正在将一个可正常运行的apachemod-php网站移至nginxphp-fpm.在Apachemod-php下,我可以使用header(“Location:$url”);将浏览
我正在将一个可正常运行的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响应代码,如下所示:
header("HTTP/1.0 301 Moved Permanently");
?>
…然后,当然,您需要确保在发送上面显示的HTTP / 1.0 …行之后仍然发送了Location标头.