最近有个需求是这样的,做了个cdn分析小工具给运营的同学。他们输入一个 url 之后,我会去 url 上抓取所有的静态文件地址,并分析出这些地址用了哪家的 cdn。 比如 zhihu.com这个地址,解析出来的结果是这样:
如下的域名:
onepiece.zhihu.come589fa51.zhihu.com.safe.cdntip.comdayu.ddos.tc.cdntip.com
拿 e589fa51.zhihu.com.safe.cdntip.com来举例,很容易看出他的子域名是 e589fa51.zhihu.com.safe,域名是 cdntip,顶级域名是 com。
但不是每个域名的顶级域名都像 .net .com 一样只有一段,还会存在 com.cn, co.uk这样的情况。 这时候,我们没法通过简单的正则表达式来切分用户的域名。当然,复杂的正则也做不到。这时候需要一份顶级域名的列表,把域名里面的顶级域名给匹配出来。
这里有一份列表:https://publicsuffix.org/list/effective_tld_names.dat
com.cn是我们常见的顶级域名,但严格来说,只有 .cn 是顶级域名。
com.cn其实是 .cn 自主创造出来的顶级域名,由于这样情况非常广泛,所以严格意义的顶级域名很多场景下没法直接使用,我们就创造了一个【有效顶级域名】的概念。
就中国来说,下列中除了最顶部的 .cn ,其余都是不是严格的顶级域名:
// cn : https://en.wikipedia.org/wiki/.cn
// Submitted by registry <tanyaling@cnnic.cn>
cn
ac.cn
com.cn
edu.cn
gov.cn
net.cn
org.cn
mil.cn
公司.cn
网络.cn
網絡.cn
// cn geographic names
ah.cn
bj.cn
cq.cn
fj.cn
gd.cn
gs.cn
gz.cn
gx.cn
ha.cn
hb.cn
he.cn
hi.cn
hl.cn
hn.cn
jl.cn
js.cn
jx.cn
ln.cn
nm.cn
nx.cn
qh.cn
sc.cn
sd.cn
sh.cn
sn.cn
sx.cn
tj.cn
xj.cn
xz.cn
yn.cn
zj.cn
hk.cn
mo.cn
tw.cn
既然一个国家可以创造自己的顶级域名,有些组织也向这份列表提交了自己定义的有效顶级域名。
比如亚马逊提交了下面这些:
// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/
// Submitted by Philip Allchin <pallchin@amazon.com>
compute.amazonaws.com
ap-northeast-1.compute.amazonaws.com
ap-northeast-2.compute.amazonaws.com
ap-southeast-1.compute.amazonaws.com
ap-southeast-2.compute.amazonaws.com
eu-central-1.compute.amazonaws.com
eu-west-1.compute.amazonaws.com
sa-east-1.compute.amazonaws.com
us-gov-west-1.compute.amazonaws.com
us-west-1.compute.amazonaws.com
us-west-2.compute.amazonaws.com
compute-1.amazonaws.com
z-1.compute-1.amazonaws.com
z-2.compute-1.amazonaws.com
us-east-1.amazonaws.com
compute.amazonaws.com.cn
cn-north-1.compute.amazonaws.com.cn
Node.js 有个包专门做这事:https://www.npmjs.com/package/parse-domain