热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我正在将一个可正常运行的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标头.


推荐阅读
author-avatar
故事里的说书人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有