如何从URL的hostname中取出主域名


解决进度

移动到答案中去了

问题定义

先说一下【主域名】的定义,就是指一个人通过域名注册商注册的那个名字(domain name),它在注册商的系统中有个唯一的域名ID。

如t.sina.com.cn的主域名就是sina.com.cn,www.sf.gg的的主域名就是sf.gg

本来我想说根域名,但是怕大伙儿讨论的时候跟Root DNS的概念弄混了。

举例:

hostname             ->  主域名
sf.gg                ->  sf.gg
image.google.com.hk  ->  google.com.hk
www.example.com      ->  example.com
www.yahoo.co.jp      ->  yahoo.co.jp
www.online.sh.cn     ->  online.sh.cn
www.sh.cn            ->  sh.cn
www.nc.jx.cn         ->  nc.jx.cn
www.jx.cn            ->  www.jx.cn
deal.z.cn            ->  z.cn

我的努力

这无非是个字符串匹配的问题,我首先没去找现成的类库,从wikipedia上整理出了顶级国际域名的后缀(TLD,Top Level Domain,如com, org, net, gov)和国家域名(ccTLD,Country Code Top Level Domain,如cn, uk, hk, tw, jp)

但,我只发现TLD是能观察出规律的,都是3-4位,ccTLD是有ISO标准的,都是2位。

把hostname用点号分隔,从最后一段开始处理,是3-4位的是国际域名,连同倒数第二段返回即可。

如果最后一段是2位,那就是国家域名,返回最后一段、倒数第二段,很可能也需要倒数第三段。让我无法逾越的问题出现了:

无法确定倒数第三段是子域名,还是主域名的一部分

例如,yahoo.co.jp,co根本不是一个TLD。因为TLD都是3-4位,也意味着倒数第二段哪些是保留的(如根据CNNIC的规定,各省份的两位字母缩写就是保留不可公开注册的),是较难制作字典的。

即使倒数第二位是保留的,程序遇到www.jx.cn(中国机械网)和www.nc.jx.cn(江西南昌市官方网站)的时候也不能正确处理。

我查了ccTLD的维基资料,也没找到规范来帮我解决www.jx.cn和www.nc.jx.cn的问题。

试着搜索了英文资料,找到的资料大多是parse_url的,根据它们的源码判断,他们也解决不了我这个问题。

如果再找不到规范,我想,有一个笨办法:查whois信息。不从规范上理论判断,从现实存在的域名中判断。

我想得到的帮助

任何帮助和提示,我都很乐意看到。我特别想知道:

网络 域名

成长的代价 11 years, 2 months ago

Mozilla 是专门有个 列表 的。 Text link 扩展也自带了个列表。

另外,有少数几个顶层域名是可以直接访问的。

用 dig 命令可以知道 DNS 查询路径:


 dig +trace www.nc.jx.cn

Anaying answered 11 years, 2 months ago

Your Answer