在Web开发中,获取当前域名是一项基础且常见的操作,无论是处理跨域请求、构建动态URL,还是实现单点登录等功能,都需要准确获取当前页面的域名信息,JavaScript提供了多种方式来获取域名,但不同方法适用于不同场景,且需要注意浏览器兼容性、安全限制等细节,本文将系统介绍JavaScript获取当前域名的各种方法、适用场景及注意事项,帮助开发者全面掌握相关技巧。

基础概念:域名的组成与浏览器环境
在讨论如何获取域名前,需要先明确域名的结构,一个完整的URL通常包含多个部分,例如https://www.example.com:8080/path?query=value#fragment,其中与域名相关的核心部分包括:
- 协议(Protocol):如
https:、http:,表示数据传输方式; - 主机(Host):即域名,可能包含子域名(如
www)和端口号(如8080); - 域名(Hostname):不包含端口号的主机部分,如
www.example.com; - 源(Origin):由协议、主机和端口组成,是浏览器同源策略的核心依据,如
https://www.example.com:8080。
在浏览器环境中,JavaScript通过window.location对象或document对象访问这些信息,理解各部分的区别,有助于选择正确的获取方法。
获取当前域名的主要方法
通过window.location对象获取
window.location是JavaScript中与当前URL相关的核心对象,它提供了多个属性,可以灵活获取域名的不同部分。
-
window.location.hostname:获取当前页面的主机名(不包含端口和协议),访问https://www.example.com:8080时,返回"www.example.com",这是最常用的获取域名的方式,适用于大多数场景,如构建API请求地址、判断当前环境等。 -
window.location.host:获取主机名和端口号(如果端口为默认的80或443,则不显示)。https://www.example.com:8080返回"www.example.com:8080",而https://www.example.com返回"www.example.com",当需要明确端口时(如区分开发环境和生产环境),可以使用此属性。 -
window.location.origin:获取完整的源(协议+主机+端口)。https://www.example.com:8080返回"https://www.example.com:8080",此属性常用于跨域请求时设置Origin头,或构建绝对路径的URL。
示例代码:
const hostname = window.location.hostname; // 如 "www.example.com"
const host = window.location.host; // 如 "www.example.com:8080"
const origin = window.location.origin; // 如 "https://www.example.com:8080"
console.log(`Hostname: ${hostname}, Host: ${host}, Origin: ${origin}`);
通过document.domain获取
document.domain属性返回当前文档的域名,但它的行为与window.location.hostname有所不同:
- 默认情况:
document.domain与window.location.hostname返回值相同; - 跨子域场景:可以通过设置
document.domain为父域,实现跨子域通信(如a.example.com和b.example.com均可设置document.domain = "example.com")。
注意事项:

document.domain只能设置为当前域名的父域或自身,不能设置为完全不同的域名(如example.com不能设置为other.com);- 设置后,
document.domain的值会被转换为小写,且不包含子域名部分(如www.example.com设置后变为example.com)。
示例代码:
const domain = document.domain; // 默认与hostname相同,可手动设置
console.log(`Document domain: ${domain}`);
通过URL接口解析(现代浏览器推荐)
现代浏览器提供了URL接口,可以更规范地解析URL字符串,避免手动处理字符串分割的问题,通过new URL(window.location.href)创建URL对象后,可直接访问hostname、host、origin等属性。
优势:
- 代码可读性更高,逻辑更清晰;
- 支持动态解析任意URL,而不仅限于当前页面。
示例代码:
const url = new URL(window.location.href);
const hostname = url.hostname; // "www.example.com"
const host = url.host; // "www.example.com:8080"
const origin = url.origin; // "https://www.example.com:8080"
console.log(`Hostname: ${hostname}, Host: ${host}, Origin: ${origin}`);
兼容性:URL接口在IE浏览器中不支持,若需兼容旧浏览器,可通过polyfill或直接使用window.location。
获取域名的注意事项
同源策略的限制
浏览器的同源策略会限制跨域资源的访问,但获取当前域名属于同源操作,通常不受影响,在以下场景中需要注意:
- iframe嵌套:如果当前页面被嵌入到其他域名的iframe中,直接通过
window.location获取的是iframe的域名,而非父页面的域名,此时需与父页面协商,通过postMessage通信获取父域名; - 跨域脚本:若通过
<script>标签加载跨域脚本,脚本中无法直接访问window.location(会报安全错误)。
端口与协议的处理
window.location.host和window.location.origin会包含端口号(非默认端口时),而hostname不包含,在构建URL时,需根据需求选择是否包含端口。
- 开发环境使用
http://localhost:3000,生产环境使用https://example.com,此时host能明确区分环境; - 若只需要域名(如Cookie的
domain属性),则应使用hostname。
安全与XSS防护
获取的域名可能来自用户输入(如动态构建URL时),需警惕XSS攻击,避免直接拼接用户提供的域名到可执行代码中:
// 危险:直接拼接用户输入的域名
const userDomain = userInput; // 可能包含恶意脚本
const scriptUrl = `https://${userDomain}/malicious.js`;
const script = document.createElement('script');
script.src = scriptUrl;
document.body.appendChild(script); // 可能导致XSS
安全做法:对域名进行白校验,或使用URL接口解析并验证域名格式。

实际应用场景
跨域请求与CORS
在前端与后端API交互时,需将请求发送到当前域名的对应接口。
const apiOrigin = window.location.origin;
const apiUrl = `${apiOrigin}/api/data`;
fetch(apiUrl)
.then(response => response.json())
.then(data => console.log(data));
单点登录(SSO)实现
在多子域系统中,单点登录需要获取当前域名并构建回调URL,用户在a.example.com登录后,需跳转到sso.example.com并携带回调参数:
const currentDomain = window.location.hostname;
const callbackUrl = `https://sso.example.com/callback?domain=${currentDomain}`;
window.location.href = callbackUrl;
动态加载资源
根据当前域名加载不同环境的资源(如开发环境加载本地脚本,生产环境加载CDN资源):
const isDev = window.location.hostname === 'localhost';
const scriptUrl = isDev
? 'http://localhost:8080/dev.js'
: 'https://cdn.example.com/prod.js';
const script = document.createElement('script');
script.src = scriptUrl;
document.head.appendChild(script);
常见问题与解决方案
为什么window.location.hostname获取的域名与预期不符?
可能原因:
- URL包含端口号:
hostname不包含端口,而host包含,需确认需求; - iframe嵌套:当前页面在iframe中,获取的是iframe的域名,需与父页面通信获取;
- 浏览器扩展影响:某些扩展可能修改
location对象,需在无扩展环境下测试。
在Node.js中如何获取当前域名?
Node.js环境没有window对象,可通过url模块或http模块的请求对象获取:
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const hostname = url.parse(req.url).hostname || req.headers.host.split(':')[0];
console.log(`Current hostname: ${hostname}`);
res.end('Hello World');
});
server.listen(3000);
如何兼容旧浏览器获取域名?
对于不支持URL接口的浏览器(如IE),可直接使用window.location,或引入core-js等polyfill:
// 兼容旧浏览器的polyfill
if (!window.URL) {
window.URL = require('url-polyfill');
}
JavaScript获取当前域名的方法多样,需根据具体场景选择:
- 简单获取主机名:优先使用
window.location.hostname; - 需要包含端口或完整源:使用
window.location.host或window.location.origin; - 现代浏览器规范解析:推荐
URL接口,代码更清晰; - 跨子域通信:通过
document.domain设置父域。
需注意同源策略、端口处理、安全防护等细节,确保域名获取的准确性和安全性,掌握这些方法,能有效提升Web开发的灵活性和健壮性。