PHP中的HTTP_HOST和SERVER_NAME有什么区别?

2022-08-30 05:50:05

在 PHP 中 和 之间有什么区别?$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']

您何时会考虑使用一个而不是另一个,为什么?


答案 1

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

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


更新:在检查了Pekka对您的问题的回答之后,其中包含一个指向bobince答案的链接,PHP将始终返回的值,这与几年前我自己的PHP 4.x + Apache HTTPD 1.2.x经验背道而驰,我从Windows XP上当前的XAMPP环境中吹了一些灰尘(Apache HTTPD 2.2.1与PHP 5.2.8), 启动了它,创建了一个打印两个值的PHP页面,创建了一个使用URLConnection修改标头的Java测试应用程序,测试告诉我这确实是(不正确的)情况。HTTP_HOSTSERVER_NAMEHost

在首先怀疑PHP并挖掘了有关该主题的一些PHP错误报告之后,我了解到问题的根源在于使用的Web服务器,它在请求时错误地返回了HTTP标头。因此,我使用有关该主题的各种关键字深入研究Apache HTTPD错误报告,最终发现了一个相关的错误。这种行为是从Apache HTTPD 1.3开始引入的。您需要将 UseCanonicalName 指令设置为 in 的条目中(还要检查文档底部的警告!HostSERVER_NAMEon<VirtualHost>ServerNamehttpd.conf

<VirtualHost *>
    ServerName example.com
    UseCanonicalName on
</VirtualHost> 

这对我有用。

总结一下,更可靠,但你依赖于服务器配置!SERVER_NAME


答案 2

HTTP_HOST是客户端发送的目标主机。它可以由用户自由操作。向您的网站发送请求以请求值为 没有问题。HTTP_HOSTwww.stackoverflow.com

SERVER_NAME来自服务器的定义,因此被认为更可靠。但是,在与Web服务器的设置方式相关的某些条件下,也可以从外部对其进行操作:请参阅此SO问题,其中涉及这两种变体的安全方面。VirtualHost

你不应该依赖任何一个来确保安全。也就是说,使用什么实际上取决于你想做什么。如果要确定脚本在哪个域上运行,只要来自恶意用户的无效值无法破坏任何内容,就可以安全地使用。HTTP_HOST


推荐