什么是 PSL?
Mozilla 推动维护的 Public Suffix List(公共后缀列表)是一项跨厂商项目,用于定义哪些域名后缀允许用户直接注册,例如 .com、.co.uk、.jp 等。
PSL GitHub 地址:https://github.com/lupomontero/psl
PSL(Public Suffix List Parser) 是由开发者 Lupo Montero 维护的 JavaScript 域名解析库,基于该列表实现精准域名结构解析。它能够识别:
- 顶级域(TLD / Public Suffix)
- 二级域(SLD)
- 主域名
- 子域名
该库经过 Mozilla 提供的测试数据验证,并支持 Node.js 与浏览器环境。
简单理解:PSL 可以把复杂域名拆解成结构化数据,帮助程序正确识别真正的主域名。
PSL 能解决什么问题?
在互联网中,域名后缀并不总是单层结构,例如:
- example.com
- example.co.uk
- city.kobe.jp
如果仅按最后一个点拆分,程序可能误判主域名。
PSL 通过公共后缀规则库来准确识别可注册域,从而:
- 正确设置 Cookie 域范围
- 识别用户站点归属
- 构建安全策略(防止跨站 Cookie 滥用)
- 日志分析与流量归类
- 多租户系统域名解析
公共后缀列表的存在正是为浏览器和安全策略提供准确域划分依据。
核心 API 详解
1. psl.parse(domain)
解析域名结构:
import psl from 'psl';
const result = psl.parse('www.blog.example.co.uk');
console.log(result);
返回:
{
tld: 'co.uk',
sld: 'example',
domain: 'example.co.uk',
subdomain: 'www.blog'
}
返回字段说明:
- tld → 公共后缀
- sld → 二级域
- domain → 主域名
- subdomain → 子域部分
2. psl.get(domain)
获取主域名:
psl.get('a.b.example.com');
// example.com
无效域名返回 null。
3. psl.isValid(domain)
判断域名是否合法:
psl.isValid('google.com'); // true
psl.isValid('invalid_domain'); // false
适合用于输入校验。
实际应用示例
1. 获取网站主域
function getRootDomain(url) {
const hostname = new URL(url).hostname;
return psl.get(hostname);
}
getRootDomain('https://sub.shop.example.co.uk');
// example.co.uk
2. Cookie 安全域设置
document.cookie = "user=123; domain=" + psl.get(location.hostname);
确保 Cookie 仅作用于正确域范围。
3. 分析访问来源
psl.parse('cdn.images.site.jp').domain
// site.jp
便于统计真实站点来源。
PSL 的优势
- 准确性高:基于持续更新的公共后缀列表。
- 跨环境支持:Node.js、浏览器、CDN 均可使用。
- 轻量且快速:适合前端与服务端实时解析。
- 支持国际化域名:可解析 IDN(中文域名等)。
与类似库对比
在解析域名的生态中,还有如 tldts 等库提供更复杂 URL 解析功能。
PSL 适合:
- 轻量域名解析
- Cookie / 安全策略
- 基础域名拆分
- 更复杂需求可考虑:
- URL 解析
- IP识别
- 邮件域解析
总结
PSL 是一个轻量但极其重要的域名解析工具,它借助公共后缀列表实现准确的域名结构识别。对于涉及 Cookie、安全策略、用户数据隔离、多租户系统或流量统计的应用来说,它几乎是不可或缺的基础组件。如果你的项目需要正确理解复杂域名结构,PSL 能提供简单、高效且可靠的解决方案。