理解域名的基本概念
在深入探讨 JavaScript 如何获取域名之前,首先需要明确几个基本概念,域名(Domain Name)是互联网上用于识别和定位计算机的层次化命名系统,www.example.com,完整的域名由多个部分组成,每个部分用点号()分隔,从右到左依次为顶级域名(TLD)、二级域名、三级域名等,在 www.example.com 中,com 是顶级域名,example 是二级域名,www 是三级域名。

浏览器环境中的 JavaScript 运行在客户端,可以通过内置的 Location 对象或 Document 对象访问当前页面的 URL 信息,进而提取域名相关的数据,理解域名的结构有助于后续更精准地操作和解析。
使用 location 对象获取域名
location 是 JavaScript 中一个非常重要的内置对象,它包含了当前文档 URL 的详细信息,通过 location 对象的属性,可以轻松获取域名的不同部分,以下是常用的属性及其用途:
-
location.hostname
该属性返回当前 URL 的主机名,即域名部分,对于https://www.example.com:8080/path?query=1,location.hostname的值为"www.example.com",这是获取完整域名的最直接方式。 -
location.host
与hostname不同,location.host返回的是主机名加端口号(如果指定了端口),上述 URL 中location.host的值为"www.example.com:8080",URL 未指定端口,则与hostname相同。 -
location.origin
该属性返回 URL 的源,包括协议、主机名和端口(如果指定),上述 URL 中location.origin的值为"https://www.example.com:8080",需要注意的是,origin是只读属性,不能被修改。
通过 location 对象获取域名非常简单,只需在代码中直接调用相应属性即可。
const domain = location.hostname; console.log(domain); // 输出当前页面的主机名
使用 document 对象获取域名
除了 location 对象,document 对象也提供了获取域名信息的方法。document.domain 属性返回当前文档的域名,但需要注意其使用场景和限制:
document.domain
该属性返回当前文档的域名,通常用于同源策略下的跨域通信,如果当前 URL 是https://sub.example.com/page,则document.domain的值为"example.com",需要注意的是,document.domain是可写的,但只能设置为当前域名的父级域名,且设置后会影响同源策略的判断。
console.log(document.domain); // 输出当前文档的域名 document.domain = "example.com"; // 仅当当前域名为子域名时有效
document.domain 的使用存在局限性,它不能设置为完全不同的域名(例如从 example.com 设置为 other.com);在安全严格的上下文(如 HTTPS)中,其行为可能受到限制,在现代 Web 开发中,location.hostname 是更推荐的选择。
解析域名的不同部分
我们不仅需要获取完整的域名,还需要解析域名的各个组成部分(如顶级域名、二级域名等),这可以通过字符串分割或正则表达式实现,以下是一个示例函数,用于提取域名的各级部分:
function parseDomain(hostname) {
const parts = hostname.split('.');
return {
subdomain: parts.slice(0, -2).join('.'), // 三级及以下域名
domain: parts.slice(-2, -1).join('.'), // 二级域名
tld: parts.slice(-1).join('.') // 顶级域名
};
}
const parsed = parseDomain(location.hostname);
console.log(parsed); // 输出解析后的域名各部分
需要注意的是,顶级域名(TLD)的解析可能更复杂,因为有些 TLD 是多级的(如 co.uk),在实际应用中,建议使用专门的库(如 tldjs)来处理这类需求,以确保准确性。
跨域环境下的域名获取
在跨域场景下,由于同源策略的限制,直接通过 JavaScript 获取其他域名的信息可能会受到限制,在 https://a.com 的页面中,无法直接访问 https://b.com 的 location 或 document 对象,以下方法可以在特定情况下获取跨域信息:

-
通过服务器代理
在服务器端请求目标域名的资源,然后将结果返回给客户端,这种方法绕过了浏览器的同源策略,但需要后端配合。 -
使用 JSONP
如果目标域名支持 JSONP,可以通过动态创建<script>标签的方式获取数据,JSONP 的实现依赖于服务器的支持,且存在安全风险。 -
使用 CORS
如果目标服务器配置了 CORS(跨域资源共享),可以通过fetch或XMLHttpRequest获取数据。fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));需要注意,CORS 需要服务器明确允许跨域请求。
安全注意事项
在获取和使用域名信息时,需要注意以下几点安全问题:
-
避免 XSS 攻击
如果将用户输入的域名直接插入到 HTML 中,可能会导致 XSS 攻击。// 危险:直接插入用户输入 document.getElementById('output').innerHTML = location.hostname;应使用
textContent或适当的转义方法:// 安全:使用 textContent document.getElementById('output').textContent = location.hostname; -
验证域名格式
在处理用户输入的域名时,应使用正则表达式或专门库验证其格式,防止恶意输入。const domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; if (domainRegex.test(userInput)) { // 域名格式有效 } -
敏感信息保护
避免在 URL 中传递敏感信息(如密码、Token),因为域名和路径可能被记录在浏览器历史或服务器日志中。
实际应用场景
获取域名的功能在实际开发中有多种应用场景,以下是一些常见例子:
-
多语言网站
根据域名判断用户所在地区,加载对应的语言资源。
const domain = location.hostname; if (domain.includes('cn')) { loadLanguage('zh-CN'); } else { loadLanguage('en-US'); } -
单点登录(SSO)
在多个子域名下实现统一登录,通过检查document.domain或location.hostname确保用户身份的跨域共享。 -
A/B 测试
根据域名或子域名将用户分配到不同的测试组,const subdomain = location.hostname.split('.')[0]; if (subdomain === 'test') { runTestVersion(); }
总结与最佳实践
在 JavaScript 中获取域名主要通过 location.hostname 和 document.domain 实现,前者更通用且安全,后者适用于特定场景,以下是最佳实践建议:
-
优先使用
location.hostname
除非需要修改document.domain以实现跨域通信,否则应优先选择location.hostname。 -
验证和清理域名
在处理用户输入或动态生成的域名时,始终进行格式验证和安全清理。 -
利用专业库
对于复杂的域名解析(如提取 TLD),使用tldjs等库,避免手动解析带来的错误。 -
注意安全与性能
避免在频繁调用的代码中重复获取域名,可以将其缓存到变量中,注意跨域请求的安全性和性能影响。
通过合理运用 JavaScript 提供的域名获取方法,并结合实际需求和安全考虑,可以高效、安全地实现各种 Web 开发中的域名相关功能。















