HTTP之间有什么区别

你什么时候考虑使用一个,为什么?


HTTP_HOST从HTTP请求头获得,这就是客户端实际用作请求的“目标主机”的内容。 SERVER_NAME在服务器配置中定义。 要使用哪一个取决于你需要什么。 然而,您现在应该意识到,这是一个客户端控制的值,因此可能不适用于业务逻辑,另一个是服务器控制的值更可靠。 但是,您需要确保所涉及的Web服务器具有正确配置的SERVER_NAME 。 以Apache HTTPD为例,下面是它的文档摘录:

如果未指定ServerName ,则服务器将尝试通过对IP地址执行反向查找来推断主机名。 如果ServerName未指定端口,则服务器将使用传入请求中的端口。 为了获得最佳的可靠性和可预测性,您应该使用ServerName指令指定明确的主机名和端口。


更新 :在你的问题上检查Pekka的答案后,你的问题中包含一个bobince的答案链接,PHP总是返回HTTP_HOSTSERVER_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