在PHP中,$_SERVER['HTTP_HOST']
和$_SERVER['SERVER_NAME']
之间有什么区别?
你会考虑何时使用另一个,为什么?
在PHP中,$_SERVER['HTTP_HOST']
和$_SERVER['SERVER_NAME']
之间有什么区别?
你会考虑何时使用另一个,为什么?
HTTP_HOST
是从HTTP request header中获得的,这是客户端实际用作请求"目标主机"的内容.SERVER_NAME
在服务器配置中定义.使用哪一种取决于你需要它做什么.然而,您现在应该意识到,一个是客户端控制的值,因此在业务逻辑中使用可能不可靠,另一个是服务器控制的值,更可靠.但是,您需要确保所讨论的Web服务器正确配置了SERVER_NAME
.以Apache HTTPD为例,下面是its documentation的摘录:
如果未指定
ServerName
,则服务器会try 通过对IP地址执行反向查找来推断主机名.如果ServerName
中没有指定端口,那么服务器将使用传入请求的端口.为了获得最佳的可靠性和可预测性,应该使用ServerName
指令指定一个显式的主机名和端口.
Update:在判断了包含bobince's answer链接的the answer of Pekka on your question之后,PHP总是会返回HTTP_HOST
的SERVER_NAME
值,这与我自己的PHP4相反.x+ApacheHTTPD1.2.几年前的x体验,我在Windows XP(Apache HTTPD 2.2.1和PHP5.2.8)上从当前的XAMPP环境中抹go 了一些灰尘,启动了它,创建了一个打印这两个值的PHP页面,创建了一个Java测试应用程序,使用URLConnection
修改Host
头,测试告诉我这确实是(错误的)情况.
在第一次怀疑PHP并深入研究了大约PHP bug reports个相关主题后,我了解到问题的根源在于所使用的web服务器,即当请求SERVER_NAME
时,它错误地返回了HTTP Host
头.所以我用various keywords深入研究了Apache HTTPD bug reports,最终找到了related bug.这种行为是在Apache HTTPD 1.3前后引入的.您需要在httpd.conf
中的ServerName
的<VirtualHost>
条目中将UseCanonicalName
指令设置为on
(同时判断the document底部的警告!).
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
这对我很管用.
总而言之,SERVER_NAME
更可靠,但你在服务器配置上是dependent!