在基于名称的虚拟主机环境中,如何获取请求对应的虚拟主机名称?
获取基于名称的虚拟主机对应的主机名
在基于名称的虚拟主机环境中,直接通过PHP的$_SERVER超全局变量就能获取到请求对应的虚拟主机名称,具体有两种可靠方式:
- 使用
$_SERVER['HTTP_HOST']:这个变量直接对应HTTP请求头里的Host字段值,也就是客户端发起请求时指定的虚拟主机域名,是最准确的取值方式。 - 使用
$_SERVER['SERVER_NAME']:这个值来自虚拟主机配置文件中的ServerName指令,当客户端未发送Host头时会 fallback 到这个值,但优先推荐HTTP_HOST。
示例代码
你可以把这个逻辑整合到自定义日志脚本中:
// 获取客户端IP $ip = $_SERVER["REMOTE_ADDR"]; // 获取请求对应的虚拟主机名称 $virtualHost = $_SERVER['HTTP_HOST']; // 可选:反向解析IP对应的主机名 $host = gethostbyaddr($ip); // 构造日志内容 $logContent = date('Y-m-d H:i:s') . " | IP: {$ip} | 反向解析主机: {$host} | 虚拟主机: {$virtualHost}\n"; // 写入日志文件(注意设置合适的文件权限) file_put_contents('custom_access_log.txt', $logContent, FILE_APPEND | LOCK_EX);
关于你遇到的Host字段问题
你之前测试时看到Host字段只显示自己的虚拟主机名称,是因为你访问的就是自己的站点。当同一IP下的其他虚拟主机被请求时,HTTP_HOST会自动变成对应站点的域名——这正是基于名称的虚拟主机工作的核心逻辑:通过Host头区分不同站点。
内容的提问来源于stack exchange,提问作者andreL
相关产品推荐
相关产品推荐

