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

新手上路,请多包涵

PHP中的 $_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME'] 有什么区别?

您何时会考虑使用其中一种,为什么?

原文由 Emanuil Rusev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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


更新:在检查 Pekka 对您的问题的回答 后,其中包含指向 bobince 答案 的链接,PHP 将始终返回 HTTP_HOST 的 --- 的值,这与我自己的 PHP 4 SERVER_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 --- 时错误地返回了 HTTP Host 标头被要求。因此,我使用有关该主题的 各种关键字 深入研究了 Apache HTTPD 错误报告,最终发现了一个 相关的错误。这种行为是在 Apache HTTPD 1.3 前后引入的。 You need to set UseCanonicalName directive to on in the <VirtualHost> entry of the ServerName in httpd.conf (also check 文档 底部的警告!)。

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

这对我有用。

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

原文由 BalusC 发布,翻译遵循 CC BY-SA 3.0 许可协议

我对所有的答案都不满意。其中一些是正确的,但没有说明整个故事,也没有把问题说清楚。

无论您使用哪个 http 服务器 HTTP_HOST 都应该在 HTTP 标头中包含从客户端发送的原始值 Host 。因此,不应信任的是用户控制的数据。

变量 SERVER_NAME 是在您的服务器配置中配置的,可能不会导致正确的 URL。例如,您的 Web 服务器前面可能有一个反向代理,并且 SERVER_NAMEserver1server2 但您不想将用户重定向到 server1 但对用户友好的主机。

因此, HTTP_HOST 是更可靠的变量,因为您可能希望客户端请求访问您的 PHP 应用程序的主机。您无需比较它们以确保这是一个有效值(它们不一定相等)。有两种方法可以确保此值有效:

  1. 将值与有效值列表进行比较(您需要知道有效值)
  2. 如果值不正确,请确保您的 Web 服务器返回错误

第一个很容易理解,但在实际场景中可能会出现问题(在您的开发环境中是这样,在暂存时是这样,在生产中是这样……等等)。这意味着您需要在 PHP 中知道什么对这个环境有效。

第二个是服务器配置:VirtualHost 是 http 服务器从同一台服务器交付多个网站的概念。由于虚拟主机是由http头选择的 Host (不区分大小写)客户端无法控制使用哪个虚拟主机,除非修改主机。当仅配置一个虚拟主机时,每个值都将使用该虚拟主机。您需要配置第二个默认虚拟主机(如果没有其他虚拟主机匹配)并始终返回错误(例如“未找到”或“禁止”)。

原文由 iRaS 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题