在PHP中,HTTP_HOST和SERVER_NAME有什么区别?
以下是$_SERVER['HTTP_HOST']
和$_SERVER['SERVER_NAME']
在PHP中的区别?
何时会考虑使用其中之一以及原因是什么?
在PHP中,$_SERVER['HTTP_HOST']
是从HTTP请求头获取的值,它是客户端实际用作请求的目标主机。而$_SERVER['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上的XAMPP环境的灰尘(使用Apache HTTPD 2.2.1和PHP 5.2.8),启动了它,创建了一个打印这两个值的PHP页面,并创建了一个使用URLConnection
来修改Host
头的Java测试应用程序,并进行了测试,结果确实是如此(不正确)。
起初怀疑是PHP的问题,并查阅了一些关于该主题的PHP错误报告,了解到问题的根源在于所使用的web服务器,在请求SERVER_NAME
时错误地返回了HTTP的Host
头部。因此,我搜索了一些关于该主题的Apache HTTPD错误报告,使用不同关键字进行搜索,最终找到了一个相关的bug。自从Apache HTTPD 1.3版本以来就引入了这种行为。你需要在httpd.conf
中的<VirtualHost>
入口的ServerName
中设置UseCanonicalName
指令为on
(还要注意该文档底部的警告!)。
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
这对我起效了。
总结起来,SERVER_NAME
更可靠,但你依赖于服务器配置!