HTTP之间有什么区别
你什么时候考虑使用一个,为什么?
HTTP_HOST
从HTTP请求头获得,这就是客户端实际用作请求的“目标主机”的内容。 SERVER_NAME
在服务器配置中定义。 要使用哪一个取决于你需要什么。 然而,您现在应该意识到,这是一个客户端控制的值,因此可能不适用于业务逻辑,另一个是服务器控制的值更可靠。 但是,您需要确保所涉及的Web服务器具有正确配置的SERVER_NAME
。 以Apache HTTPD为例,下面是它的文档摘录:
如果未指定ServerName
,则服务器将尝试通过对IP地址执行反向查找来推断主机名。 如果ServerName
未指定端口,则服务器将使用传入请求中的端口。 为了获得最佳的可靠性和可预测性,您应该使用ServerName
指令指定明确的主机名和端口。
更新 :在你的问题上检查Pekka的答案后,你的问题中包含一个bobince的答案链接,PHP总是返回HTTP_HOST
的SERVER_NAME
值,这违背了我自己的PHP 4.x + Apache HTTPD 1.2.x的经验,多年前,我在Windows XP(Apache HTTPD 2.2.1,PHP 5.2.8)中使用了当前XAMPP环境中的一些灰尘,启动了它,创建了一个打印这两个值的PHP页面,使用URLConnection
创建了一个Java测试应用程序以修改Host
头和测试告诉我这确实(不正确)的情况。
在第一次怀疑PHP并且在关于这个主题的一些PHP错误报告中挖掘之后,我了解到问题的根源在于使用了web服务器,它在请求SERVER_NAME
时错误地返回了HTTP Host
头。 因此,我使用有关该主题的各种关键字挖掘了Apache HTTPD错误报告,最后我发现了一个相关的错误。 此行为是自Apache HTTPD 1.3开始引入的。 您需要在httpd.conf
中的ServerName
的<VirtualHost>
条目中设置UseCanonicalName
指令为on
(同时检查文档底部的警告!)。
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
这对我有效。
总结起来, SERVER_NAME
更可靠,但您依赖于服务器配置!
HTTP_HOST
是客户端发送的目标主机。 它可以由用户自由操纵。 这是发送请求到您的网站要求一个没有问题HTTP_HOST
的值www.stackoverflow.com
。
SERVER_NAME
来自服务器的VirtualHost
定义,因此被认为更可靠。 但是,它也可以在某些与您的Web服务器设置有关的条件下从外部操纵:请参阅这个SO问题处理两个变体的安全方面。
你不应该依靠或者是安全的。 也就是说,使用什么取决于你想要做什么。 如果您想确定脚本运行在哪个域,只要来自恶意用户的无效值不能破坏任何内容,就可以安全地使用HTTP_HOST
。
正如我在这个答案中所提到的,如果服务器在80以外的端口上运行(开发/ Intranet机器上可能常见),那么HTTP_HOST
包含端口,而SERVER_NAME
则不包含端口。
$_SERVER['HTTP_HOST'] == 'localhost:8080'
$_SERVER['SERVER_NAME'] == 'localhost'
(至少这是我在Apache基于端口的虚拟主机中注意到的)
请注意,在HTTPS上运行时, HTTP_HOST
不包含:443
(除非您正在非标准端口上运行,而我未测试该端口)。
正如其他人所指出的那样,使用IPv6时两者也有所不同:
$_SERVER['HTTP_HOST'] == '[::1]'
$_SERVER['SERVER_NAME'] == '::1'
链接地址: http://www.djcxy.com/p/7291.html
上一篇: What is the difference between HTTP
下一篇: Absolute URLs omitting the protocol (scheme) in order to preserve the one of the current page