从URL中获取无子域名的域名

17

如何从URL中获取不包含子域名的域名?

在Java中,您可以从字符串创建一个新的URL(urlString),并在URL上调用getHost(),但是它会包含子域名。

问题在于,可能有像subhost.example.com和subhost.example.co.uk这样的主机。

还有一些其他的两部分域名,如co.uk(请参阅https://wiki.mozilla.org/TLD_List上的列表)。

在我看来,获取只有域名的唯一正确方法是通过TLD列表进行搜索,从主机末尾删除TLD,并将主机中最后一个句点之前的所有内容删除。是否存在已有的方法可以实现此功能?我在java.net.URL中没有找到这样的方法,并且我稍微检查了一下apache commons,但也没有找到。


您可以在以下网址中找到相关信息:https://dev59.com/_k7Sa4cB1Zd3GeqP7uvI - Greg Hewgill
3个回答

21

我知道这已经晚了几年,但如果有人偶然发现了这个问题,请尝试以下方法:

InternetDomainName.from("subhost.example.co.uk").topPrivateDomain().name

以上将返回example.co.uk。


4
注意,这个类在Google Guava库中。 - nerdherd
2
感谢提供这么好的信息!使用 Selenium WebDriver,它包含在独立的 jar 包中,因此可以引用它。请注意,“.name”不起作用,因为它是一个私有变量。http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/net/InternetDomainName.html - Lukus
@Lukus 没错。我是用 Groovy 写的。 - Dan
使用更新版本,不再需要这样做:InternetDomainName.from(request.getServerName()).topPrivateDomain().toString() - Dima

1

不确定上面的答案是否正确:

InternetDomainName.from("test.blogspot.com").topPrivateDomain() -> test.blogspot.com

这在我的情况下效果更好:

InternetDomainName.from("test.blogspot.com").topDomainUnderRegistrySuffix() -> blogspot.com

Details: https://github.com/google/guava/wiki/InternetDomainNameExplained


1

以上解决方案需要您添加Guava库。如果您使用OkHttp或Retrofit,您也可以使用

PublicSuffixDatabase.get().getEffectiveTldPlusOne("test.blogspot.com")

这将给你blogspot.com

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