获取子域Javascript的域名

Posted

技术标签:

【中文标题】获取子域Javascript的域名【英文标题】:Get the domain name of the subdomain Javascript 【发布时间】:2012-11-02 06:33:45 【问题描述】:

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

【问题讨论】:

sub1.example.co.uk 怎么样? publicsuffix.org 这是选项之一,感谢指正 您希望sub3.example.com.ua的域名是example.com还是example.com.ua? example.com.ua 我需要允许在特定域及其子域上使用脚本,同时禁止在其他域中使用它。所以我需要对域名进行选择。 还有什么用途,例如meta.cooking.stackexchange.com/http://cooking.stackexchange.com/ 【参考方案1】:
var parts = location.hostname.split('.');
var subdomain = parts.shift();
var upperleveldomain = parts.join('.');

要仅获取二级域,您可以使用

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

【讨论】:

@Bergi - 我知道 OP 适用于域名而不是 IP 地址,但我只是想指出,虽然这对命名地址很有用,但它不适用于基于 IP 的地址并错误地将它们分解(即 127.0.0.1 返回“0.1”)。 @johntrepreneur:你的意思是hostname是一个IP地址?是的,但我想不出在那种情况下会有多大意义的结果……应该不加修改地返回吗? @Bergi - 是的,主机名是不常见的 IP 地址(开发中除外)。是的,我刚刚检查了它有 3 个点(拆分后的 4 个部分)并且主机名(减去点)只是数字。 if (arrHostname.length == 4 && /^\d+$/.test(hostname.replace(/\./g, ''))) // is IP address; return hostname unmodified @Bergi - 很抱歉让您感到困惑。这个 OP 真正针对的是域名而不是域 IP,所以我的评论并不真正适用。我刚刚实现了它,并注意到它在我使用 127.0.0.1 的情况下不起作用,所以我想我会提到它,即使它与 OP 并不完全相关。 @HankYang:co.uk 是子域(二级域),我的 sn-p 也适用于此。如果您正在寻找有效的二级域名,则必须将public suffix list 合并到您的应用程序中。【参考方案2】:

接受的答案将用于获得二级域。但是,您可能需要考虑一些称为“公共后缀”的东西。否则,您可能会得到意想不到的错误结果。

以域www.amazon.co.uk 为例。 如果你只是尝试获取二级域,你最终会得到co.uk,这可能不是你想要的。那是因为co.uk 是一个“公共后缀”,这意味着它本质上是一个***域。这是公共后缀的定义,取自https://publicsuffix.org:

“公共后缀”是互联网用户可以(或过去可以)直接注册名称的一种。

如果这是您的应用程序的关键部分,我会研究类似psl (https://github.com/lupomontero/psl) 的域解析。它适用于 nodejs 和浏览器,并在 Mozilla 维护的公共后缀列表上进行了测试。

这是他们自述文件中的一个简单示例:

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');

【讨论】:

【参考方案3】:

这样更快

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

【讨论】:

【参考方案4】:

这里解释了通用解决方案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;
)();

【讨论】:

【参考方案5】:

    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”

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于获取子域Javascript的域名的主要内容,如果未能解决你的问题,请参考以下文章

小米范工具系列之九:小米范子域名收集工具

域名相关信息收集(whois,子域名,旁站C段)

python爬虫获取子域名以及对“百度安全验证”问题的解决

关联域名查询脚本

javascript跨域的解决方案

whois老域名挖掘技术