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

依然范特西╮ 提交于 2020-02-26 15:02:30

您何时会考虑使用另一种,为什么呢?


#1楼

正如我在此答案中提到的那样,如果服务器在除80以外的端口上运行(这在开发/内联网计算机上可能很常见),则HTTP_HOST包含该端口,而SERVER_NAME则不包含。

$_SERVER['HTTP_HOST'] == 'localhost:8080'
$_SERVER['SERVER_NAME'] == 'localhost'

(至少我在基于Apache端口的虚拟主机中注意到了这一点)

需要注意的是HTTP_HOST 包含:443对HTTPS运行时(除非你是一个非标准端口,我没有测试运行)。

正如其他人指出的,使用IPv6时两者也有所不同:

$_SERVER['HTTP_HOST'] == '[::1]'
$_SERVER['SERVER_NAME'] == '::1'

#2楼

取决于我要查找的内容。 SERVER_NAME是服务器的主机名,而HTTP_HOST是客户端连接到的虚拟主机。


#3楼

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

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


更新 :在检查了您的问题的Pekka答案后 ,该链接包含bobince答案的链接,即PHP始终会为SERVER_NAME返回HTTP_HOST的值,这与我自己的PHP 4.x + Apache HTTPD 1.2.x的经验相违背多年前,我从Windows XP(带有PHP 5.2.8的Apache HTTPD 2.2.1)上的当前XAMPP环境中清除了灰尘,启动了它,创建了一个同时打印两个值的PHP页面,创建了一个使用URLConnection进行修改的Java测试应用程序Host标头和测试告诉我,确实是(错误地)情况。

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

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

这对我有用。

综上所述, SERVER_NAME更可靠,但您依赖服务器配置!


#4楼

HTTP_HOST是客户端发送的目标主机。 用户可以自由操作它。 这是发送请求到您的网站要求一个没有问题HTTP_HOST的值www.stackoverflow.com

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

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


#5楼

如果要检查server.php或其他内容,请使用以下命令进行调用:

<?php
    phpinfo(INFO_VARIABLES);
?>

要么

<?php
    header("Content-type: text/plain");

    print_r($_SERVER);
?>

然后使用您网站的所有有效URL对其进行访问,并检查差异。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!