在PHP开发中,获取当前访问域名是构建动态链接、判断访问环境、配置资源路径等场景下的基础需求,我们可以通过全局数组中的相关参数快速实现这个功能。

常用获取域名的方法
1. 使用$_SERVER['HTTP_HOST']
$_SERVER['HTTP_HOST']是获取当前访问域名最常用的方式,它的值来自HTTP请求头中的Host字段,会包含用户实际访问的域名和端口(如果端口不是默认的80或443)。
<?php // 获取当前访问域名 $domain = $_SERVER['HTTP_HOST']; echo $domain; // 如果访问地址是http://www.ipipp.com:8080/index.php // 输出结果为 www.ipipp.com:8080 ?>
2. 使用$_SERVER['SERVER_NAME']
$_SERVER['SERVER_NAME']的值来自服务器配置文件,通常是Web服务器中配置的服务器名称,默认情况下不包含端口信息,且不受用户请求头的影响。
<?php $serverName = $_SERVER['SERVER_NAME']; echo $serverName; // 如果服务器配置的主机名是www.ipipp.com // 输出结果为 www.ipipp.com ?>
两种方法的差异对比
| 对比项 | $_SERVER['HTTP_HOST'] | $_SERVER['SERVER_NAME'] |
|---|---|---|
| 数据来源 | HTTP请求头的Host字段 | Web服务器配置文件 |
| 是否包含端口 | 非默认端口时会包含 | 默认不包含 |
| 是否可被用户修改 | 是(请求头可被伪造) | 否(由服务器配置决定) |
| 适用场景 | 需要获取用户实际访问的域名 | 需要固定的服务器配置域名 |
获取完整访问地址的方法
如果需要获取包含协议头的完整访问地址,可以结合$_SERVER['REQUEST_SCHEME']或者$_SERVER['HTTPS']来判断当前访问协议,再拼接域名。
<?php
// 判断当前访问协议
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
$scheme = 'https';
} else {
$scheme = $_SERVER['REQUEST_SCHEME'] ?? 'http';
}
// 获取域名
$domain = $_SERVER['HTTP_HOST'] ?? '';
// 拼接完整访问地址
$fullUrl = $scheme . '://' . $domain;
echo $fullUrl;
// 如果访问的是https://www.ipipp.com/test.php
// 输出结果为 https://www.ipipp.com
?>
注意事项
- 在CLI模式下运行时,$_SERVER数组中通常没有HTTP_HOST和SERVER_NAME等参数,需要提前做好兼容处理。
- 如果服务器配置了多个虚拟主机,SERVER_NAME的值可能和实际访问的域名不一致,此时优先使用HTTP_HOST。
- 因为HTTP_HOST来自请求头,存在被伪造的可能,如果用于安全校验场景,需要额外做合法性验证。
- 部分代理服务器环境下,HTTP_HOST可能被修改,需要确认代理配置是否透传了原始的Host头。
通用封装示例
我们可以把获取域名的逻辑封装成一个通用函数,适配不同的使用场景。
<?php
/**
* 获取当前访问域名
* @param bool $withScheme 是否包含协议头
* @return string
*/
function getCurrentDomain($withScheme = false) {
// CLI模式下返回空字符串
if (PHP_SAPI === 'cli') {
return '';
}
$domain = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? '';
if ($withScheme) {
$scheme = 'http';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
$scheme = 'https';
} elseif (isset($_SERVER['REQUEST_SCHEME'])) {
$scheme = $_SERVER['REQUEST_SCHEME'];
}
$domain = $scheme . '://' . $domain;
}
return $domain;
}
// 调用示例
echo getCurrentDomain(); // 输出域名
echo getCurrentDomain(true); // 输出带协议的完整域名
?>
PHP获取域名HTTP_HOSTSERVER_NAMEREQUEST_SCHEME修改时间:2026-06-30 16:27:15