PHP中的HTTP_HOST和SERVER_NAME有什么区别?
在 PHP 中 和 之间有什么区别?$_SERVER['HTTP_HOST']
$_SERVER['SERVER_NAME']
您何时会考虑使用一个而不是另一个,为什么?
在 PHP 中 和 之间有什么区别?$_SERVER['HTTP_HOST']
$_SERVER['SERVER_NAME']
您何时会考虑使用一个而不是另一个,为什么?
是从 HTTP 请求标头获取的,这就是客户端实际用作请求的“目标主机”的内容。在服务器配置中定义。使用哪一个取决于您需要它做什么。但是,您现在应该意识到,一个是客户端控制的值,因此可能不可靠,无法在业务逻辑中使用,另一个是服务器控制的值,它更可靠。但是,您需要确保有问题的Web服务器具有正确的配置。以Apache HTTPD为例,这是其文档的摘录:HTTP_HOST
SERVER_NAME
SERVER_NAME
如果指定 no,则服务器将尝试通过对 IP 地址执行反向查找来推断主机名。如果在 中未指定端口,则服务器将使用来自传入请求的端口。为了获得最佳的可靠性和可预测性,应使用该指令指定显式主机名和端口。
ServerName
ServerName
ServerName
更新:在检查了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_HOST
SERVER_NAME
Host
在首先怀疑PHP并挖掘了有关该主题的一些PHP错误报告之后,我了解到问题的根源在于使用的Web服务器,它在请求时错误地返回了HTTP标头。因此,我使用有关该主题的各种关键字深入研究Apache HTTPD错误报告,最终发现了一个相关的错误。这种行为是从Apache HTTPD 1.3开始引入的。您需要将 UseCanonicalName
指令设置为 in 的条目中(还要检查文档底部的警告!Host
SERVER_NAME
on
<VirtualHost>
ServerName
httpd.conf
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
这对我有用。
总结一下,更可靠,但你依赖于服务器配置!SERVER_NAME
HTTP_HOST
是客户端发送的目标主机。它可以由用户自由操作。向您的网站发送请求以请求值为 没有问题。HTTP_HOST
www.stackoverflow.com
SERVER_NAME
来自服务器的定义,因此被认为更可靠。但是,在与Web服务器的设置方式相关的某些条件下,也可以从外部对其进行操作:请参阅此SO问题,其中涉及这两种变体的安全方面。VirtualHost
你不应该依赖任何一个来确保安全。也就是说,使用什么实际上取决于你想做什么。如果要确定脚本在哪个域上运行,只要来自恶意用户的无效值无法破坏任何内容,就可以安全地使用。HTTP_HOST