2007年2月15日星期四

正确理解CNAME

这年头,很多商家总喜欢把一些很普通的东西当成噱头,玩儿概念,故弄玄虚,欺负普通消费者不懂行,故意迷惑人。比如卖域名的人经常会搞一些投机的短域名,拿三级域名冒充顶级域名来卖。~咳,扯的有点远。发现很多人对域名的相关知识了解的比较少,非常容易上当。我在这里解释一下域名的CNAME记录的问题,这也是人们最容易产生迷惑的问题。

当一个域名添加了CNAME记录,则该域名将继承CNAME记录值所设定域名的除NS记录以外的全部记录。顺便说一句,这句话完全是我自己编的,绝非出自某一著作;-) 这里的域名包括顶级域名及其子域名和泛域名。上面的话可能比较费解,下面举个例子说明一下。

比如有这样一个域名:example.com 。我们给它的一个子域名 www.example.com 添加CNAME记录,记录值是 www.google.com ,那么,www.example.com 将会继承 www.google.com 的各项记录,你的记录值是什么,我的记录值也是什么,包括A、MX、CNAME、TXT等等,但是肯定不包括NS记录,否则逻辑显然不通了,因为只有先知道NS才能知道CNAME是什么。这里顺便提一下,NS记录首先应该存在于更高一级的DNS服务器上,example.com 的NS记录存在于负责解析 .com 根域的DNS服务器上。

下面简单介绍一下DNS查询的过程。当互联网客户提出要查询 www.example.com 的A记录时,本地的DNS服务器将会根据 example.com 的NS记录(查询NS记录当然也要从根“.”开始一步一步来,这里就省略了)找到负责解析 example.com 的DNS服务器,并向其询问 www.example.com 的A记录,但是 www.example.com 只有CNAME记录,那么这个负责解析 example.com 的DNS服务器就会向提出查询的DNS服务器返回其CNAME值:www.google.com,意思是说,www.example.com 的A记录和 www.google.com 的一样,你去查 www.google.com 就行了,接下来,本地的DNS服务器就会以同样的步骤去查询 www.google.com 的A记录,最后查出来的结果就作为 www.example.com 的A记录返回给客户端。当然,如果 www.google.com 恰好也是设置了CNAME的话,本地的DNS也会继续按上面的步骤根据 www.google.com 的CNAME值往下查。这里的A记录换成MX、TXT等其他记录项也是同样的道理。

由此可见,既然一个域名添加了CNAME后,继承了CNAME值中域名的全部记录,那么这个域名本身也就没有必要存在除CNAME以外的其他记录了,只要一个CNAME记录就全都包括了。事实的确如此,并且如果强行给一个已经添加了CNAME的域名再添加其他记录项,那么负责解析该域名的DNS服务器可能会出现错误,并导致死循环。

国内很多域名商提供给客户的域名解析Web管理程序中,常常禁止给顶级域名——也就是只有“example.com”,没有主机名的这种形式——添加CNAME记录,其实这是因为顶级域名通常作为邮箱后缀需要添加MX记录,而CNAME和MX同时存在会出错,所以服务商十分鲁莽地完全禁止了给顶级域添加CNAME。但是这种禁止并不妥当,并且造成了很多误解,导致很多人以为顶级域不可以添加CNAME,其实顶级域只要没有MX记录,是照样可以添加CNAME的。相比之下,国外一些DNS服务商对于这个问题处理的就很灵活,他们并不会禁止给顶级域添加CNAME,但是当已经存在CNAME时再添加MX记录,则会给出提示。但是国内即使是新网、万网这样比较大的域名服务商却做不到这点,不知道是开发人员概念不清还是出于懒惰。

这里推荐一个国外的老牌免费DNS服务——zoneedit,他们的产品做的很规范,功能也全,对正确理解DNS的配置很有帮助。提醒一下,修改顶级域名的NS记录千万不要在注册商提供的管理域名解析的地方(有的叫“MyDNS”)操作,发现很多人犯这个错误。前面说过,NS记录应该在更高一级的DNS服务器中修改,作为购买域名的客户,应该可以在修改域名信息的地方找到修改顶级域名NS记录(DNS服务器)的表单。注册商提供的MyDNS只不过是一个增值服务,可有可无,用zoneedit这样的免费服务完全可以代替,只要把顶级域名的NS修改成zoneedit提供的DNS服务器,那个MyDNS也就没用了。

9 条评论:

  1. 你的文章让我解决了一个棘手的问题啊,原来我把主域名设为cname,又有mx记录,所以老是用不了。那个zoneedit是什么东西?顺便试验下 blogger的openid登录评论

    回复删除
  2. 请教一个问题哈,我将www.wsblog.net绑定到我blogger了,但他那个重新定向wsblog.net到www.wsblog.net貌似没有用啊。

    回复删除
  3. 回复Andy Wu (wonsore):
    那你也要给wsblog.net添加一个CNAME记录“ghs.google.com”才可以哦。不过如果你的域名解析服务商不支持给顶级域名添加CNAME或者你的顶级域名已经添加了MX的话,你也可以直接把“ghs.google.com”的IP添加到A记录里。

    回复删除
  4. 确实,国内的好像大多不支持主域名cname。谢谢指点。

    回复删除
  5. 对了,我并没有发表到我的空间,只是将域名和BLOGGER绑定了,需要将备案信息标注上去么? 我的域名是.net,但是在国内注册的。

    回复删除
  6. 回复Andy Wu (wonsore):
    我觉得吧,只要不是用国内的空间,备不备案他管不了。

    回复删除
  7. 你好,我还是不明白。比如,我要将我的域名A做cname到ghs.google.com,那么在zoneedit里面我应该怎么填?
    ___is another name for___
    我的域名是填在前面?

    回复删除
  8. 回复huary:
    A is another name for ghs.google.com

    回复删除