博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端JS如何获取主域名(根域名)
阅读量:6275 次
发布时间:2019-06-22

本文共 1749 字,大约阅读时间需要 5 分钟。

背景

最近项目中需要获取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项目:。

这里有各种主域名的列表:.

浏览器其实也有内置类似的东西,用来做域名判断,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里面的域名,跑了一下单元测试,没有问题。

转载地址:http://snwva.baihongyu.com/

你可能感兴趣的文章
5: Calling Programs(Working with programs)
查看>>
QML学习笔记-入门篇(2)
查看>>
H3C设备网络组建和设置
查看>>
windows上一样使用linux命令--xshell登陆cygwin
查看>>
Linux查看系统配置常用命令
查看>>
大端 VS 小端
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
虚拟机克隆之后无法正确获取静态ip
查看>>
Java 连接Kafka报错java.nio.channels.ClosedChannelExcep
查看>>
字符设备驱动程序——poll机制介绍
查看>>
Markdown使用
查看>>
iOS - cocoapods/pod
查看>>
Apache+Tomcat(windows环境下)整合
查看>>
Java程序员应该收藏的书籍
查看>>
小菜学设计模式——策略模式
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>