|

PSL(Public Suffix List)JavaScript域名解析库详解:安装、API与实际应用

什么是 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 能提供简单、高效且可靠的解决方案。

评论