前端JS如何获取主域名(根域名)
来源:互联网 发布:军用软件下载 编辑:程序博客网 时间:2024/06/05 06:57
点击查看全文
背景
最近项目中需要获取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 registrationaisai.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.doamin
和document.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里面的域名,跑了一下单元测试,没有问题。
点击查看全文
- 前端JS如何获取主域名(根域名)
- js获取当前域名
- js获取当前域名
- js获取当前域名
- js获取当前域名
- js获取当前域名
- js获取当前域名
- js获取当前域名
- js获取网站域名
- [JavaScript] 用js如何获取当前url地址中的域名
- JS 获取域名等信息
- JS获取当前域名信息
- js获取域名携带参数
- 获取根域名
- 如何获取简单的域名
- javascript提取顶级域名 js获取一级域名
- 获取域名
- 前端js获取域名和页面完整地址(方法整理带http或https)
- 爬虫maizi
- log4j有针对性的将日志输出到不同文件且不重复输出到root中
- Centos Yum error – ImportError: No module named cElementTree
- Spring框架中的各种*Aware接口
- PostMessage和SendMessage
- 前端JS如何获取主域名(根域名)
- JavaScript中的call和apply用法
- jboss规则引擎KIE Drools 6.3.0-高级讲授篇
- 爬虫mm
- 改变、透明状态栏和导航栏颜色 (沉浸式状态栏)
- JavaScript 面向对象(一)认识对象
- iOS应用架构谈 view层的组织和调用方案
- 时间超限解决方法之折半查找法定位置
- linux 清理pagecache