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

背景

最近项目中需要获取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里面的域名,跑了一下单元测试,没有问题。

时间: 2024-09-13 16:08:02

前端JS如何获取主域名(根域名)的相关文章

php获取根域名方法汇总

  如果你只简单获取当前访问你页面的域名,我们只需要使用php中的函数HTTP_HOST就可以搞定了,如果是提取url根域名是需要正则的,下面就来看看几个具体实例. 如果是获取当前域名是非常的简单的: 代码如下: //获取当前的域名: echo $_SERVER['SERVER_NAME']; //获取来源网址,即点击来到本页的上页网址 echo $_SERVER["HTTP_REFERER"]; $_SERVER['REQUEST_URI'];//获取当前域名的后缀 $_SERVER

php获取根域名方法汇总_php技巧

本文实例汇总了php获取根域名方法,分享给大家供大家参考.具体实现方法如下: 如果你只简单获取当前访问你页面的域名,我们只需要使用php中的函数HTTP_HOST就可以搞定了,如果是提取url根域名是需要正则的,下面就来看看几个具体实例. 如果是获取当前域名是非常的简单的: 复制代码 代码如下: <?php //获取当前的域名: echo $_SERVER['SERVER_NAME']; //获取来源网址,即点击来到本页的上页网址 echo $_SERVER["HTTP_REFERER&q

php获取根域名几个示例

如果是获取当前域名是非常的简单的  代码如下 复制代码 <? //获取当前的域名: echo $_SERVER['SERVER_NAME']; //获取来源网址,即点击来到本页的上页网址 echo $_SERVER["HTTP_REFERER"]; $_SERVER['REQUEST_URI'];//获取当前域名的后缀 $_SERVER['HTTP_HOST'];//获取当前域名 dirname(__FILE__);//获取当前文件的物理路径 dirname(__FILE__).

两种js获取当前域名代码

 今天给各位朋友介绍两种js获取当前域名  代码如下 //获取当前域名 1.window.location.host; 2.document.domain; //获取当前页面地址 url = window.location.href;   例子  代码如下 <script language="javascript"> //获取域名 host = window.location.host; host2=document.domain; //获取页面完整地址 url = win

js 常用indexof url,域名,浏览类型 获取函数

js 常用indexof url,域名,浏览类型 获取函数 */ function pv_rport(dm,f) {   var i = dm.indexof(f);   if (i > 0) {    return  dm.substring(0, i);   }   return dm;  }  function getrefurl(refurl) {   if (refurl.indexof('ref0') > -1){    var regexstr = /(?:&|?)ref

使用PHP获取根域名的方法!

/** * 取得根域名 * @param type $domain 域名 * @return string 返回根域名 */ function GetUrlToDomain($domain) { $re_domain = ''; $domain_postfix_cn_array = array("com", "net", "org", "gov", "edu", "com.cn", &q

web前端-怎么用js来获取网页元素,请求响应事件和返回数据大小

问题描述 怎么用js来获取网页元素,请求响应事件和返回数据大小 如图那样..不要使用后台,直接用jq来抓取,可不可行??领导说不能用后台语言来实现..本来用C#做好了的,现在又要重新做过 解决方案 js不是有函数什么的,利用js语法应该可以的

【前端性能】浅谈域名发散与域名收敛

性能优化一直是前端工作中十分重要的一环,都说从 10 到 1 容易,从 1 到 0 很难.而随着前端技术的飞速发展,没有什么技术或者法则是金科玉律一成不变的. 很佩服那些勇于挑战权威,推陈出新的勇者,是他们让我们的技术不断的变革更加的卓越.好像扯远了,本文主要想谈谈两个名词,域名发散和域名收敛.      域名发散 这个很好理解,前端er都知道,PC 时代为了突破浏览器的域名并发限制,遵循这样一条定律: · http 静态资源采用多个子域名 嗯,为什么要这样做呢,目的是充分利用现代浏览器的多线程

使用js如何获取服务器的ip地址

问题描述 使用js如何获取服务器的ip地址 使用js如何获取服务器的ip地址,找了老多办法,只可以获取到域名 解决方案 可以使用后台语言配合实现.http://blog.csdn.net/wenpengy/article/details/4709581 解决方案二: js好像本身不能获取服务器的IP,但JSP可以,所以用个隐藏域,js就可以借鸡下蛋了. jsp代码如下: 解决方案三: js好像本身不能获取服务器的IP,但JSP可以,所以用个隐藏域,js就可以借鸡下蛋了. jsp代码如下: 解决方