2025年5月22日 星期四 乙巳(蛇)年 二月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > JavaScript

前端JS如何获取主域名(根域名)

时间:01-09来源:作者:点击数:34
城东书院 www.cdsy.xyz

背景

最近项目中需要获取url的主域名,比如www.baidu.com那么就需要获取baidu.com,看似简单,.号分隔,取到最后两位就行,但是坑爹的是有xxx.com.cn这类域名,还有很多日本的域名,类似toei.aichi.jp等,这些都无法通过这种简单的取最后两位的方式来获取,看来只能枚举了。

Public Suffix List

这问题肯定是早有人就遇到了,于是各路有识之士已经帮你完整得准备好了一个列表,里面全部都是那些奇葩域名,一些jp域名也是让我长见识了,不知道各位老司机在秋名山飙车的时候有没有见过这些个域名:

  • 秋田.jp
  • 群馬.jp
  • 香川.jp
  • 高知.jp
  • 鳥取.jp
  • 鹿児島.jp
  • // jp geographic type names
  • // http://jprs.jp/doc/rule/saisoku-1.html
  • *.kawasaki.jp
  • *.kitakyushu.jp
  • *.kobe.jp
  • *.nagoya.jp
  • *.sapporo.jp
  • *.sendai.jp
  • *.yokohama.jp
  • !city.kawasaki.jp
  • !city.kitakyushu.jp
  • !city.kobe.jp
  • !city.nagoya.jp
  • !city.sapporo.jp
  • !city.sendai.jp
  • !city.yokohama.jp
  • // 4th level registration
  • aisai.aichi.jp

感兴趣的朋友可以看看这个github项目:https://github.com/wrangr/psl。

这里有各种主域名的列表:https://publicsuffix.org/list/public_suffix_list.dat.

浏览器其实也有内置类似的东西,用来做域名判断,cookie存储之类的事宜。

pls的问题

问题看似好像解决了,已经有现成的脚本去获取,但是仔细一看这脚本竟然有将近200K,而我自己的脚本才10K,既然浏览器已经内置了pls,那浏览器有没有暴露内置接口呢?很遗憾,搜索了一下并没有,而且浏览器那么多,即使chrome暴露了,IE肯定没有,等等,刚刚好像我们说到浏览器用来做域名判断,cookie存储,那我们能不能用这类方式间接地去调用内置pls呢?

最终解决方案

目前想到有两种方式可以间接去调,document.doamindocument.cookie,测试一下就会发现,如果你尝试把当前域名设置为com.cn或者把cookie设置到com.cn上面,浏览器并不会生效,document.domain在第二次设置的时候,firefox会抛错,看来并不是很合适,而且可能多多少少会影响到业务,cookie设置方便,而且清除也方便,上代码:

  • function getMainHost() {
  • let key = `mh_${Math.random()}`;
  • let keyR = new RegExp( `(^|;)\\s*${key}=12345` );
  • let expiredTime = new Date( 0 );
  • let domain = document.domain;
  • let domainList = domain.split( '.' );
  • let urlItems = [];
  • // 主域名一定会有两部分组成
  • urlItems.unshift( domainList.pop() );
  • // 慢慢从后往前测试
  • while( domainList.length ) {
  • urlItems.unshift( domainList.pop() );
  • let mainHost = urlItems.join( '.' );
  • let cookie = `${key}=${12345};domain=.${mainHost}`;
  • document.cookie = cookie;
  • //如果cookie存在,则说明域名合法
  • if ( keyR.test( document.cookie ) ) {
  • document.cookie = `${cookie};expires=${expiredTime}`;
  • return mainHost;
  • }
  • }
  • }

拉了差不多几十个pls里面的域名,跑了一下单元测试,没有问题。

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐