PHP中的 $_SERVER['HTTP_HOST']
和 $_SERVER['SERVER_NAME']
有什么区别?
您何时会考虑使用其中一种,为什么?
原文由 Emanuil Rusev 发布,翻译遵循 CC BY-SA 4.0 许可协议
PHP中的 $_SERVER['HTTP_HOST']
和 $_SERVER['SERVER_NAME']
有什么区别?
您何时会考虑使用其中一种,为什么?
原文由 Emanuil Rusev 发布,翻译遵循 CC BY-SA 4.0 许可协议
我对所有的答案都不满意。其中一些是正确的,但没有说明整个故事,也没有把问题说清楚。
无论您使用哪个 http 服务器 HTTP_HOST
都应该在 HTTP 标头中包含从客户端发送的原始值 Host
。因此,不应信任的是用户控制的数据。
变量 SERVER_NAME
是在您的服务器配置中配置的,可能不会导致正确的 URL。例如,您的 Web 服务器前面可能有一个反向代理,并且 SERVER_NAME
是 server1
和 server2
但您不想将用户重定向到 server1
但对用户友好的主机。
因此, HTTP_HOST
是更可靠的变量,因为您可能希望客户端请求访问您的 PHP 应用程序的主机。您无需比较它们以确保这是一个有效值(它们不一定相等)。有两种方法可以确保此值有效:
第一个很容易理解,但在实际场景中可能会出现问题(在您的开发环境中是这样,在暂存时是这样,在生产中是这样……等等)。这意味着您需要在 PHP 中知道什么对这个环境有效。
第二个是服务器配置:VirtualHost 是 http 服务器从同一台服务器交付多个网站的概念。由于虚拟主机是由http头选择的 Host
(不区分大小写)客户端无法控制使用哪个虚拟主机,除非修改主机。当仅配置一个虚拟主机时,每个值都将使用该虚拟主机。您需要配置第二个默认虚拟主机(如果没有其他虚拟主机匹配)并始终返回错误(例如“未找到”或“禁止”)。
原文由 iRaS 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答1.4k 阅读✓ 已解决
798 阅读
649 阅读
HTTP_HOST
是从 HTTP 请求标头 中获得的,这是客户端实际用作请求的“目标主机”的内容。SERVER_NAME
在服务器配置中定义。使用哪一个取决于您需要它的用途。但是,您现在应该意识到,一个是客户端控制的值,因此在业务逻辑中使用可能不可靠,另一个是更可靠的服务器控制的值。但是,您需要确保有问题的网络服务器正确配置了SERVER_NAME
。以 Apache HTTPD 为例,以下是 其文档 的摘录:更新:在检查 Pekka 对您的问题的回答 后,其中包含指向 bobince 答案 的链接,PHP 将始终返回
HTTP_HOST
的 --- 的值,这与我自己的 PHP 4SERVER_NAME
。 x + Apache HTTPD 1.2.x 几年前的经验,我从我当前在 Windows XP 上的 XAMPP 环境(Apache HTTPD 2.2.1 和 PHP 5.2.8)中吹了一些灰尘,启动它,创建了一个 PHP 页面来打印这两个值,使用URLConnection
创建了一个 Java 测试应用程序来修改Host
标头和测试告诉我,这确实是(错误地)情况。在第一次怀疑 PHP 并挖掘了一些关于该主题的 PHP 错误报告 后,我了解到问题的根源在于使用的 Web 服务器,它在
SERVER_NAME
--- 时错误地返回了 HTTPHost
标头被要求。因此,我使用有关该主题的 各种关键字 深入研究了 Apache HTTPD 错误报告,最终发现了一个 相关的错误。这种行为是在 Apache HTTPD 1.3 前后引入的。 You need to setUseCanonicalName
directive toon
in the<VirtualHost>
entry of theServerName
inhttpd.conf
(also check 文档 底部的警告!)。这对我有用。
总结一下,
SERVER_NAME
更可靠,但你 依赖 于服务器配置!