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

Posted

技术标签:

【中文标题】$_SERVER[\'HTTP_HOST\'] 也包含端口号 =/【英文标题】:$_SERVER['HTTP_HOST'] contains port number too =/$_SERVER['HTTP_HOST'] 也包含端口号 =/ 【发布时间】:2011-05-29 03:17:26 【问题描述】:

我不知道这可能是一个错误。

我的服务器上有 2 个虚拟主机。

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

我能知道为什么吗?

【问题讨论】:

我建议发布您的 VirtualHost 定义。 我建议 rtfm php.net/manual/en/reserved.variables.server.php 【参考方案1】:

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

我建议改用$_SERVER['SERVER_NAME'],因为它的值将从您的虚拟主机配置中设置。然而,正如 Flimm 在下面指出的,即使 SERVER_NAME 的可靠性仍然取决于服务器配置(请查看 this answer 了解更多信息)。

【讨论】:

请注意,这比这要复杂一些,$_SERVER['SERVER_NAME'] 并不总是值得信任的。 See this question【参考方案2】:

以下函数总是返回没有端口的真实主机(用户键入的主机),它几乎是可靠的:

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

【讨论】:

return strstr($_SERVER['HTTP_HOST'], ':', true); @lawrence-cherone 如果没有找到 ':' 字符,这将返回一个空字符串。最好使用strtok($_SERVER['HTTP_HOST'], ':');

以上是关于$_SERVER['HTTP_HOST'] 也包含端口号 =/的主要内容,如果未能解决你的问题,请参考以下文章

是否可以更改 htaccess 中的 $_SERVER['HTTP_HOST'] ? [关闭]

PHP $_SERVER['HTTP_HOST'] vs. $_SERVER['SERVER_NAME'],我对手册页的理解正确吗?

关于$_SERVER['SERVER_NAME']和$_SERVER['HTTP_HOST']的区别

$_SERVER 中HTTP_HOST 和 SERVER_NAME

JSP 或 JavaScript 等价于 PHP 的 $_SERVER["HTTP_HOST"]?

HTTP_HOST , SERVER_NAME 区别