$_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