Skip to content

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


🏷 杂项   🕒 8/31/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 个解析:

bash
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.