如何从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信息。不从规范上理论判断,从现实存在的域名中判断。
我想得到的帮助
任何帮助和提示,我都很乐意看到。我特别想知道:
- 域名国际标准中,有没有一个概念是和我所描述的主域名对应的?类似TLD、ccTLD这样的
- www.jx.cn和www.nc.jx.cn在DNS里的查询路径是怎样的?
- www.jx.cn(中国机械网)这种与保留ccTLD重名的,是不是不能再设... , bbs.jx.cn应该是不允许的吧,否则就与nc.jx.cn冲突了