获取当前域名,最稳妥的直接方法是打开浏览器控制台执行window.location.hostname,但真正干活的时候还得看你在前端、后端还是命令行环境。 下面把三条路都走一遍,顺便聊聊端口、协议、反向代理这几个坑,保证你看完能直接用到项目里。
JS获取当前域名代码与细节
前端页面里,浏览器已经把地址栏拆好了,不用自己写正则去抠字符串,三个最常用的属性先记住:
window.location.hostname:只要域名,不带端口和协议,example.com。window.location.host:域名加端口,example.com:8080。window.location.origin:协议加域名加端口,https://example.com:8080。
假如你正站在 https://example.com:8080/path 这个页面上,上面三个属性分别返回 example.com、example.com:8080、https://example.com:8080,多数业务场景要第一个,但做跳转或拼接口地址时,origin 才够用。
域名、端口和协议别搞混
搜索“获取当前域名”的人,往往真正想要的是“带协议和端口的完整地址”,因为域名只是一小段,判断环境时需要区分情况,我自己习惯这么记:
- 只判断是哪个站点,用
hostname。 - 本地开发带端口调试,用
host。 - 发请求拼API地址,用
origin。
还有一个老属性 document.domain,过去经常用来跨域,但现代浏览器已经收紧了它的使用范围,日常开发里不要把它当成获取域名的主方案。
iframe页面的域名问题
如果你嵌在别人的页面里,window.location.hostname 拿到的是 iframe 内部页面的域名,不是顶层页面,想拿最外层域名,可以试 window.top.location.hostname,但跨域时会直接抛异常,比较实用的办法是读取 document.referrer,不过它只在跳转进入时存在,不一定可靠,所以做嵌入组件时,最好别依赖顶层域名,改成由宿主页面把域名通过参数传进来。
PHP获取当前域名方法和常见坑
后端写接口时,域名从 $_SERVER 全局变量里取,最常见的写法是这两行:
$domain1 = $_SERVER['HTTP_HOST']; $domain2 = $_SERVER['SERVER_NAME'];

这两个值经常一样,但含义完全不同。HTTP_HOST 来自客户端请求头里的 Host 字段,SERVER_NAME 来自服务器配置的虚拟主机名,行业共识认为,HTTP_HOST 更接近用户实际访问的域名,但它能由请求头直接伪造,用在白名单判断之前一定要过滤和校验。
为什么不直接信任 SERVER_NAME
如果一台服务器用同一个IP跑了多个站点,SERVER_NAME 返回的是默认虚拟主机的名字,不是当前请求真正访问的域名,反过来,HTTP_HOST 会老老实实带上用户在地址栏输入的内容,所以PHP站点获取当前域名,默认选 HTTP_HOST,然后做两件事:
- 用
filter_var清洗非法字符。 - 提前收集一份允许访问的域名列表,再判断是否在列表内。
域名带着端口怎么办
HTTP_HOST 会把端口一起带出来,localhost:3000,如果你只需要纯域名,用 parse_url 拆一下:
$host = $_SERVER['HTTP_HOST'];
$domain = parse_url('http://' . $host, PHP_URL_HOST);
这个方法对 IPv4 地址也管用,拆完之后拿到的是 IP 而不是域名,需要自己再判断,在 Laravel 或 ThinkPHP 里,框架一般提供了 request()->getHost() 或 request()->root() 这类方法,普通项目直接调框架方法就好,别自己抠 $_SERVER。
获取当前域名命令行的操作路径
离开代码,在服务器终端里也有获取域名的需求,很多人第一反应是 hostname 命令,但这里要劝一句:服务器的主机名和网站域名不是同一个概念。hostname -f 拿到的是操作系统层面的完整主机名,可能是 web-01.example.com,而你的网站可能绑在另一个域名上。
用 dig 和 nslookup 反查
想确认某个 IP 绑定了哪些域名,DNS 反查是一个路径:
nslookup 你的IP dig -x 你的IP
反查出来的 PTR 记录常用于邮件服务器反向验证,但很多普通网站没有配置 PTR,所以没有结果不代表有问题,更常用来判断的是直接查解析记录:
dig +short example.com
拿返回的 IP 和当前服务器的实际 IP 对比,就能知道 DNS 到底指哪了。

通过 Nginx 配置确认域名
如果服务器的 Web 服务是 Nginx,一条命令就能看到所有绑定的域名:
nginx -T | grep server_name
这套操作适合部署排查,能直接定位是配置写错了,还是 DNS 解析到了别的机器,别忘了 nginx -T 会输出全部配置,内容可能很长,建议加个 grep 过滤。
不同环境下的获取方式对比
| 环境 | 推荐方法 | 关键注意点 |
|---|---|---|
| 浏览器前端 | window.location.hostname |
不带端口,适合域名判断 |
| Node.js | request.headers.host |
需要自己拆端口 |
| PHP后端 | $_SERVER['HTTP_HOST'] |
优先用它,但必须过滤 |
| Nginx | $host 或 $server_name |
判断真实请求域名用 $host |
| WordPress | home_url() |
返回完整地址,含协议 |
| 命令行 | hostname -f |
注意和网站域名区分 |
这张表不是用来背的,重点是知道每个环境都有自己的默认钥匙,别混着用。
获取当前域名时容易被忽略的问题
反向代理和负载均衡下的真实域名
很多系统是前端 Nginx 反代到后端 Java 或 PHP 容器,此时后端看到的 Host 往往是内网主机名,node1,解决办法是让 Nginx 把原始 Host 通过头部传下去:
proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $http_host;
后端代码取 $_SERVER['HTTP_X_FORWARDED_HOST'] 时,必须先确认代理服务器是自己人,否则任何人都能伪造这个头,业内专家指出,不少安全漏洞就是把不可信的转发头直接当作域名使用导致的,如果有多层代理,这个头会变成逗号分隔的列表,处理时注意取最左边那一项。
WordPress怎么取完整域名
如果建站用的是 WordPress,不用手动抠 $_SERVER,直接使用内置函数:
home_url():返回网站首页地址,https://example.com
。
get_site_url():返回 WordPress 安装目录地址。get_bloginfo('url'):同样是安装地址,适合主题里用。
这三个函数都考虑到了协议和端口,多站点模式下还会自动匹配子域名,自己写 $_SERVER 反而容易出错。
获取当前域名时端口到底要不要
这是“获取当前域名端口”这个长尾词真正关心的点,核心问题是:我拿到的是 example.com:8080,存数据库时该不该去掉端口?这要分场景说:
- 做页面跳转,保留端口,否则本地开发环境全乱套。
- 做 Cookie 作用域或跨域白名单,只保留域名,因为端口不是域名的组成部分。
- 做 API 请求,用
origin,保留协议、域名、端口三件套。
关于获取当前域名的常见问题
JS获取当前域名代码里,location.host 和 location.hostname 到底选哪个?
只做域名身份判断用 hostname,它不携带端口;需要保持完整访问地址时用 host,两者都是只读字符串,不存在性能差异,在 file:// 协议下,两个属性都可能返回空字符串,这是正常现象。
PHP获取当前域名时,为什么 $_SERVER['HTTP_HOST'] 会带上端口?
因为 HTTP 请求头里的 Host 字段本身就包含端口,浏览器会根据地址栏自动把端口跟在域名后面,这也是为了支持一台服务器上跑多个不同端口的站点,如果不需要端口,用前面介绍的 parse_url 方法拆一次即可。
网站怎么获取真实域名而不是内网IP?
真实域名的判断依赖 Host 信息,当用户通过公网域名访问,后端的 HTTP_HOST 会自动带上公网域名,如果还是拿到内网IP,八成是出现了反向代理转发,需要在代理层配置 proxy_set_header Host $host,后端代码再根据可信代理设置选择对应字段,不要直接信任 X-Forwarded-Host,除非你已经限定了代理来源。
获取当前域名这件事,说难不难,说简单也有不少分支,前端记住 location.hostname,后端记住 $_SERVER['HTTP_HOST'],运维记住 $host,大部分问题就解决了,真正复杂的是遇到代理环境时,先理清链路,再决定用哪个字段。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/785021.html

