在“Location:”标头中使用协议相对性URI

10
我在PHP手册中发现如下内容:

HTTP/1.1要求在» Location: 中包含完整的URI,包括协议、主机名和绝对路径,但一些客户端也接受相对URI。

为了方便那些想使用HTTPS连接的用户,我想将我的PHP脚本中的头文件从以下代码更改为:

header("Location: http://www.example.com/"); 更改为 header("Location: //www.example.com/");

我已经测试了上述代码在我的Firefox浏览器上可以工作,但我不确定这是否是一个明智的做法。或者我是否应该从 $_SERVER 变量中提取协议并放入其中。

1
可能是重复的问题:302 重定向到相对 URL 是有效还是无效的? - Raedwald
2个回答

9

HTTPbis更新允许使用相对URI,虽然没有明确说明,但这也包括协议相对URL。

(它首先是HTTP/1.1规范的更新,记录已建立的浏览器行为。)


这很有用。谢谢。HTTP/1.1 已经存在了很长时间了。我可以说这种行为已经被大多数现代浏览器强制执行了吗? - Question Overflow
1
我认为很重要的一点是要指出你链接的文档目前仍然只是一个草案!直到今年9月它才会被提交给IESG作为标准的考虑。无论如何,最重要的是对于OP来说,我认为不是规范所说的内容,而是浏览器在现实中的行为。 - Mark Amery

2

根据HTTP协议的建议,您应该使用绝对URI。 您仍然可以通过使用$_SERVER['HTTPS']变量来检测协议,并使用类似以下条件:

$protocol = "http" . (!empty($_SERVER['HTTPS']) ? "s" : "");

1
请注意,当使用ISAPI与IIS时,如果请求不是通过HTTPS协议进行的,则该值将为“off”。(已报告IIS7在将PHP作为Fast-CGI应用程序运行时具有相同的行为)。 - mikiqex
1
如果您的应用程序正在运行HTTP并且位于使用HTTPS的反向代理后面,则此方法将无法正常工作。 - Travis Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接