获取子域名的域名(Javascript)

37
我如何使用JavaScript从可能的子域名集合sub1.example.com sub2.example.com sub3.example.com中获取域名example.com

3
sub1.example.co.uk 是什么情况?http://publicsuffix.org/ - SLaks
这是其中一种选择,感谢纠正。 - Aleksov
你想让子域名sub3.example.com.ua的域名是example.com还是example.com.ua? - Matt Zeunert
1
例如,meta.cooking.stackexchange.com/http://cooking.stackexchange.com/有什么用途? - David Thomas
使用location.host并截断子域名...请查看此帖子https://dev59.com/PGsy5IYBdhLWcg3w4x_c - Scorpio
显示剩余5条评论
7个回答

92
var parts = location.hostname.split('.');
var subdomain = parts.shift();
var upperleveldomain = parts.join('.');

为了仅获取二级域名,您可以使用

var parts = location.hostname.split('.');
var sndleveldomain = parts.slice(-2).join('.');

5
@Bergi - 我知道这个帖子是针对域名而不是IP地址的,但我想指出的是,虽然这对于命名的地址非常有效,但对于基于IP的地址却无效,并且会错误地将它们拆分(即127.0.0.1会返回“0.1”)。 - johntrepreneur
@johntrepreneur:你是说当hostname是一个IP地址时?是的,但是我想不出在这种情况下会有什么有意义的结果...应该返回未修改的吗? - Bergi
@Bergi - 是的,主机名是IP地址,尽管这在开发中很不常见。是的,我刚刚检查了它是否有3个点(在分割后有4个部分),并且主机名(除去点)仅包含数字。if (arrHostname.length == 4 && /^\d+$/.test(hostname.replace(/\./g, ''))) // 是IP地址;返回未经修改的主机名 - johntrepreneur
@Bergi - 抱歉让你感到困惑。这个帖子实际上是针对域名而不是域IP的,所以我的评论并不适用。我刚刚实施了它,并注意到在使用127.0.0.1时它没有起作用,所以我想提一下,即使它与OP不完全相关。 - johntrepreneur
2
@HankYang:co.uk是子域名(二级域名),我的代码片段同样适用于它。如果你正在寻找有效的二级域名,你需要在你的应用程序中加入公共后缀列表 - Bergi
显示剩余4条评论

8
接受的答案可以用于获取二级域名。然而,你可能需要考虑到所谓的“公共后缀”。否则,你可能会得到意外和错误的结果。
例如,以域名www.amazon.co.uk为例。 如果只尝试获取二级域名,你最终将得到co.uk,这可能不是你想要的。那是因为co.uk是一个“公共后缀”,这意味着它本质上是一个顶级域名。以下是来自https://publicsuffix.org的公共后缀定义:
“公共后缀”是用户可以(或历史上可以)直接注册名称的后缀。
如果这是你的应用程序的关键部分,我建议你查看像psl这样的域解析工具(https://github.com/lupomontero/psl)。它适用于nodejs和浏览器,并在Mozilla维护的公共后缀列表上进行了测试。
以下是他们README中的一个快速示例:
var psl = require('psl');

// TLD with some 2-level rules.
psl.get('uk.com'); // null);
psl.get('example.uk.com'); // 'example.uk.com');
psl.get('b.example.uk.com'); // 'example.uk.com');

5

这更快

const firstDotIndex = subDomain.indexOf('.');
const domain = subDomain.substring(firstDotIndex + 1);

0

一些更加强大的版本,独立于子域名数量

function getDomain() {
   const hostname = window.location.hostname.split('.');
   hostname.reverse();
   return `${hostname[1]}.${hostname[0]}`;
}

0

如果你想验证特定子域是否存在

var parts = location.hostname.split('.');
if(parts.includes('subdomain_to_search_here')){
   //yes
}else{
   //no
}

0

    function getDomain() {
        const hostnameArray = window.location.hostname.split('.')
        const numberOfSubdomains = hostnameArray.length - 2
        return hostnameArray.length === 2 ? window.location.hostname : hostnameArray.slice(numberOfSubdomains).join('.')
    }
    console.log(getDomain());

这将删除所有子域,因此"a.b.c.d.test.com"将变为"test.com"


0

通用解决方案在这里进行了解释 http://rossscrivener.co.uk/blog/javascript-get-domain-exclude-subdomain 来自以上链接

var domain = (function(){
   var i=0,domain=document.domain,p=domain.split('.'),s='_gd'+(new Date()).getTime();
   while(i<(p.length-1) && document.cookie.indexOf(s+'='+s)==-1){
      domain = p.slice(-1-(++i)).join('.');
      document.cookie = s+"="+s+";domain="+domain+";";
   }
   document.cookie = s+"=;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain="+domain+";";
   return domain;
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接