前言
在PHP开发中,经常需要获取当前访问的主域名。无论是生成绝对URL、处理跨域请求,还是做域名级别的判断,获取当前域名都是基础需求。本文将分享一个实用的PHP函数,自动识别HTTPS协议并返回完整的主域名。
核心代码实现
主要获取主域名,自动识别证书(https://或http://),可以当作普通函数使用,也可以在框架中添加为公共函数。
function getHostDomain()
{
return getHttpType() . $_SERVER['SERVER_NAME'];
}
/**
* 获取 HTTPS协议类型
* @return string
*/
function getHttpType()
{
return $type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
}
代码解析
1. getHostDomain()函数
这是主函数,直接返回当前域名(包含协议)。通过调用 getHttpType() 获取是 https:// 还是 http://,再拼接上 $_SERVER['SERVER_NAME'] 获取当前域名。
2. getHttpType()函数
自动检测当前请求使用的协议类型:
- $_SERVER['HTTPS']:标准的HTTPS检测方式,当HTTPS开启时值为 'on'
- $_SERVER['HTTP_X_FORWARDED_PROTO']:当网站部署在反向代理(如Nginx负载均衡、Cloudflare)后面时,通过此值判断真实协议
使用示例
// 直接调用
$domain = getHostDomain();
echo $domain; // 输出: https://www.example.com 或 http://www.example.com
// 在ThinkPHP框架中,可以放到application/common.php中
// 在任何控制器或模型中直接调用
$url = getHostDomain() . '/uploads/avatar.jpg';
echo $url; // 输出: https://www.example.com/uploads/avatar.jpg
注意事项
- $_SERVER['SERVER_NAME'] 获取的是不含端口号的域名
- 如果需要包含端口,可以使用 $_SERVER['HTTP_HOST']
- 在有反向代理的环境中(如Nginx+PHP-FPM),务必检查 HTTP_X_FORWARDED_PROTO 才能正确识别HTTPS
- $_SERVER['REQUEST_SCHEME'] 也可以获取协议,但需要PHP 5.4+,并且不适用于反向代理环境
扩展:获取完整URL
如果需要获取包含路径和参数的完整URL,可以使用以下函数:
function getFullUrl()
{
return getHttpType() . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
这个函数返回的结果类似:https://www.example.com/page?id=123

发表评论 取消回复