从 location.host 获取根域
Posted
技术标签:
【中文标题】从 location.host 获取根域【英文标题】:Get root domain from location.host 【发布时间】:2012-05-12 10:13:38 【问题描述】:有很多 SO 问题似乎可以解决这个问题的变体。但它们往往是复杂的正则表达式答案,我希望我能找到更简单的东西。
给定 location.host 的值
foo.mysite.com
app.foo.mysite.com
mysite.com
如何获取根域mysite.com
?
我可以做一些事情,比如找到倒数第二个 .
,但这看起来很难看,并且不适用于像 .co.uk
这样的任何 TLD。如果 jQuery 有一个包含这些信息的对象,我很乐意使用它。
我的目标是创建存在于所有子域中的 cookie。为此,我需要找到.mysite.com
。我不想硬编码它。
【问题讨论】:
给定一个有效 TLD 的列表,这应该不难 - 而不是倒数第二个.
,您需要 TLD 之后的第一个 .
(从右到左阅读)。您可以使用大的正则表达式或循环来做到这一点,但后者通常效率较低。
可以在此处找到完整列表:publicsuffix.org 我想无论您使用正则表达式还是其他方式都不会产生太大影响。在任何情况下,您都必须考虑所有公共 TLD 和 SLD。看看***.com/questions/4452916/…。
github.com/riffraff/publicsuffix.js 有一个项目可以执行此操作,但它声称“已损坏”。我还没有尝试过,但它可以构成您解决方案的基础。
@FelixKling - 谢谢,太好了。投票结束我自己的问题。
如果它真的对你有帮助,你也可以删除你的问题......只是说:)快乐编码!
【参考方案1】:
考虑到我们的域名从 .com 以外的任何地方更改的可能性极低,更不用说更改为 SLD,我在其中编写了类似的代码。
var temp = location.host.split('.').reverse();
var root_domain = '.' + temp[1] + '.' + temp[0];
维护 TLD 或 SLD 列表并与之进行比较的开销和维护对我们来说不值得。
【讨论】:
tldjs library 如果您想避免自己维护,可以使用。它基于 Mozilla 公共后缀列表 您可能希望使用location.hostname
而不是host
- 请参阅***.com/questions/6725890/…【参考方案2】:
如果你想在一行上全部 -
document.domain.split('.').reverse().splice(0,2).reverse().join('.')
或
location.hostname.split('.').reverse().splice(0,2).reverse().join('.')
对于输入:'foo.example.com', 'foo.bar.example.com', 'foo.bar.fizz.buzz.example.com'
它将返回:'example.com'
【讨论】:
【参考方案3】:您不能将 .co.uk 称为 TLD。它实际上是一个second level domain。因此,根域是什么总是模棱两可的。 但是,您可以列出所有可用的 TLD 和二级域并尝试查找匹配项。但这将是一项非常昂贵且乏味的操作。 如果你想这样做,这个List of TLDs and SLDs 可能会有用:
【讨论】:
【参考方案4】:我一直在用这个:
const rootDomain = s =>
const r = /.*\.([^.]*[^0-9][^.]*\.[^.]*[^.0-9][^.]*$)/;
return s.replace(r, '$1');
;
与上述使用拆分、反向等方法的输出类似,但它不会修改直接 IP 地址。
【讨论】:
【参考方案5】:const rootDomain = '.' + window.location.hostname.split('.').slice(-2).join('.');
【讨论】:
虽然这段代码可能会解决问题,但一个好的答案还应该解释代码的什么以及它如何提供帮助。 @BDL 这段代码非常标准且不言自明。你还期待什么? 我建议将其缩减为const rootDomain = location.hostname.split('.').slice(-2).join('.');
以上是关于从 location.host 获取根域的主要内容,如果未能解决你的问题,请参考以下文章