前言

在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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部