在“Location:”标头中使用协议相关的 URI
Posted
技术标签:
【中文标题】在“Location:”标头中使用协议相关的 URI【英文标题】:Using protocol-relative URIs within "Location:" headers 【发布时间】:2012-09-08 08:03:40 【问题描述】:我在php manual 中注明了以下内容:
HTTP/1.1 需要一个绝对 URI 作为 » Location: 的参数 方案、主机名和绝对路径,但有些客户端接受 相对 URI。
为了方便更喜欢HTTPS everywhere 连接的用户,我正在考虑更改我的 PHP 脚本中的标头:
header("Location: http://www.example.com/");
到 header("Location: //www.example.com/");
我已经在我的 firefox 浏览器上测试了上面的代码,但我不确定这是否是一个可取的做法。或者我是否应该从$_SERVER
变量中提取协议并将其放入。
【问题讨论】:
Is a 302 Redirect to relative URL valid, or invalid?的可能重复 【参考方案1】:HTTPbis update 允许相对 URI。虽然没有特别提及,但这包括与协议相关的 URL。
(它首先是对记录已建立浏览器行为的 HTTP/1.1 规范的更新。)
【讨论】:
这很有用。谢谢。 HTTP/1.1 已经存在很长时间了。我可以说大多数现代浏览器已经强制执行这种行为吗? 我认为指出您链接到的文档(即使现在)只是草稿非常重要!直到今年 9 月,它才会作为标准提交给 IESG 考虑。无论如何,我认为对 OP 来说最重要的不是规范所说的,而是浏览器在现实中的行为方式。【参考方案2】:按照HTTP protocol 的建议,您应该使用absolute URI。
您仍然可以使用$_SERVER['HTTPS']
变量检测协议,条件如下:
【讨论】:
请注意,将 ISAPI 与 IIS 结合使用时,如果请求不是通过 HTTPS 协议发出的,则该值将为“off”。 (对于将 PHP 作为 Fast-CGI 应用程序运行的 IIS7 报告了相同的行为)。 如果您的应用程序正在运行 HTTP 并且位于使用 HTTPS 的反向代理之后,这将不起作用。以上是关于在“Location:”标头中使用协议相关的 URI的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript window.location 未在请求标头中设置引用者
使用 nginx proxy_pass 修改 Location 标头