$_SERVER['HTTP_HOST']包含端口号=/

11
我不确定,也许这是一个 bug。
我的服务器上有两个虚拟主机。
virtualhost1.com virtualhost2.com
如果我使用80端口打开 virtualhost1.com(virtualhost1.com:80)。
$_SERVER['HTTP_HOST']='virtualhost1.com';

但如果我打开virtualhost2.com:80

$_SERVER['HTTP_HOST']='virtualhost2.com:80'; // NOTE: with port number

我能知道为什么吗?


3
我建议您发布您的VirtualHost定义。 - rojoca
我建议你查阅官方文档(rtfm):http://php.net/manual/en/reserved.variables.server.php - dev-null-dweller
2个回答

21

$_SERVER['HTTP_HOST']的值直接取自Host: HTTP请求头。看起来是请求客户端以这种方式填充它。

我建议使用$_SERVER['SERVER_NAME'],因为它的值将从您的虚拟主机配置中设置。然而,正如Flimm在下面指出的那样,即使是SERVER_NAME的可靠性也可能取决于服务器配置(请查看此答案获取更多信息)。


请注意,这比那复杂一些,$_SERVER['SERVER_NAME']并不总是可信的。参见此问题 - Flimm

1

以下函数总是返回不带端口的真实主机(用户输入的主机),几乎可靠:

function getRealHost(){
   list($realHost,)=explode(':',$_SERVER['HTTP_HOST']);
   return $realHost;
}

只需返回 strstr($_SERVER['HTTP_HOST'], ':', true); - Lawrence Cherone
1
@lawrence-cherone 如果没有找到“:”字符,这将返回一个空字符串。最好使用strtok($ _SERVER ['HTTP_HOST'],':'); - Quinn Comendant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接