DNS的CNAME记录 与 SAE的域名绑定

31 Aug 2012

话说为什么要写这个随笔呢,还是因为迁站中间有些纠结的事情~
我在万网买的这个域名,在域名解析里面看到了A记录,MX记录,CNAME记录等等~

单(wu)纯(zhi)的我竟然不知道还有这么多种类型,网络原理的时候确实没看到过。于是查了查,原来CNAME是别名记录,因为一个IP只能对应一个域名,所以当需要多个域名都指向一台机器的时候就不行了,所以就产生个这样的东西。

经验不足,还没找到一个好点的空间商,所以就把wordpress搭在了SAE上,SAE出了个“应用仓库”的东西,把一些常用的整站系统,比如wordpress,项目关系系统,CMS之类的弄了个一键安装,可以很容易的搭建这些整站。于是我就直接安装了个wordpress,由于SAE是不允许直接写磁盘的,所以wordpress的一些功能比如在线安装主题,修改主题都不能用了。

当时我对DNS查询的流程不太熟悉,以为把域名的解析直接CNAME到SAE我的应用的二级域名就可以访问了~结果试了之后提示没有这个应用。后来想想,DNS最终的查询应该是一个IP(所有的应用都是一个),最终SAE服务器得到的是Refer应该是我自己的域名coding.so,他肯定不能知道我要访问的到底是哪个应用了。

苦恼啊~以为必须要自己买个空间,有个独立IP才行了~不过在网上搜搜,发现SAE竟然是支持域名绑定的~好奇与惊诧~我去看了看,确实可以~ SAE的绑定域名的流程是,提交需要绑定的域名,然后再域名解析里面设置2个解析:

www.coding.so CNAME -- 10分钟 jp.cname.cloudbbs.or...
680d220f2f.coding.so A -- 10分钟 168.30.249.91

第二个解析,告诉我是验证用的。 不过一时没弄明白是怎么回事的,直到我看到下面的一篇文章。

下面是我在网上查的资料:

当一个域名添加了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也就没用了。

慢慢理清了缘由,其实CNAME记录,最后返回的也只是一个IP,那么服务器是怎么知道你的身份呢?我认为应该是HTTP协议中,HTTP HEADER的HOST这个字段,表明的发送者的域名。我们在SAE 提交绑定域名申请的时候,SAE就知道我们的域名对应了哪个应用。当SAE收到请求的时候读取一下HOST就可以了~然后映射到对应的应用~

这样让我知道为啥,我在万网一直找不到 coding.so 如何添加CNAME 了~ 国内域名商太坑爹了啊~看来要coding.so直接访问SAE是不行了,必须得自己买空间,有个独立IP然后A类型解析了。

不过还有一个疑问为啥SAE让我把域名CNAME到jp.cname.cloudbbs.org这么一个奇怪的域名呢?而不是直接sinaapp.com?

上面都是我的猜想,我过会儿去做个试验来验证下~

PS:本来想写个程序,不带HOST字段去访问试试,但是貌似python的httplib是不支持的,查了一下RPC看到这几句,然后俺就放弃了~

A client MUST include a Host header field in all HTTP/1.1 request messages All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message which lacks a Host header field.



Back