在PHP中HTTP_主机和服务器_名称之间有什么区别?

PHP中的$\u服务器['HTTP\u HOST']$\u服务器['SERVER\u NAME']之间有什么区别

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

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

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


更新:在检查了Pekka关于您的问题的答案(其中包含bobince答案的链接)后,PHP将始终返回HTTP\u主机SERVER\u名称的值,这与我自己几年前的PHP4.x+ApacheHttpD1.2.x经验背道而驰,我在Windows XP(使用PHP5.2.8的Apache HTTPD 2.2.1)上从当前的XAMPP环境中抹去了一些灰尘,启动了它,创建了一个打印这两个值的PHP页面,创建了一个Java测试应用程序,使用URLConnection来修改主机头,测试告诉我情况确实如此(不正确)

在第一次怀疑PHP并深入研究有关该主题的一些PHP错误报告后,我了解到问题的根源在于所使用的web服务器,即当请求服务器名称时,它错误地返回了HTTPHost头。因此,我使用与主题相关的各种关键字深入研究了ApacheHTTPD错误报告,最终发现了一个相关的错误。这种行为是在ApacheHTTPD1.3前后引入的。您需要在<虚拟主机&gthttpd.conf中输入ServerName(同时检查文档底部的警告!)

<虚拟主机*>
ServerName example.com
在上使用CanonicalName
&lt/虚拟主机>

这对我有用

总之,SERVER\u NAME更可靠,但您依赖于服务器配置

发表评论