在PHP中,HTTP_HOST和SERVER_NAME有什么区别?

发布时间 2023-11-12 18:40:33作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=在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更可靠,但你依赖于服务器配置!