域名指向另一个域名,这事听起来有点绕,但实际使用场景很多。比如你注册了 example.com,又顺手拿了个 example.net,想让后者自动跳到前者;或者你有个主站 www.example.com,想把 blog.example.com 也指到同一个地方去。又或者你在某个平台上搭了站点,平台分配了二级域名,想用自己的域名指向它。这些场景本质上是一回事:让一个域名在 DNS 层面变成另一个域名的别名。
最直接的做法是添加一条 CNAME 记录。CNAME 的全称是 Canonical Name,翻译过来叫规范名称。它的作用就是告诉 DNS 系统:“这个域名不是独立的,它跟那个域名指向同一个地方。”比如你把 blog.example.com 设成 CNAME 指向 www.example.com,那么任何访问 blog.example.com 的请求,DNS 都会先解析到 www.example.com 的 IP,再返回给用户。浏览器地址栏里显示的仍然是 blog.example.com,不会发生变化,用户察觉不到背后的解析流程。

配置操作在域名的 DNS 管理后台完成。不管域名是在阿里云、腾讯云、Cloudflare 还是 Namecheap购买,登录后找到域名解析设置,新增解析记录。记录类型选择 CNAME,主机记录填写目标前缀。如果想让 blog.example.com 指向目标,主机记录就填 blog;如果想让整个 example.net 指向 example.com,主机记录一般填写 @。记录值填写目标域名,末尾通常不用加点,部分DNS服务商要求添加,按平台提示填写即可。TTL保持默认就行,一般为600秒或者自动。保存记录之后,解析不会立刻在全球生效,快的几分钟,慢的要等几小时,取决于各地DNS缓存刷新速度。
很多人踩过一个坑:根域名,也就是不带 www 的裸域名,标准DNS协议里不允许设置CNAME。因为根域名通常还需要配置MX记录接收邮件、TXT记录用于域名验证,CNAME和这类记录无法共存。强行配置CNAME,很可能会造成邮件无法接收。解决办法是使用DNS服务商提供的特殊记录类型,Cloudflare称之为CNAME Flattening,阿里云叫ALIAS或者显性URL转发,底层逻辑是后台将根域名CNAME解析转换成A记录,对外呈现CNAME的效果。如果服务商不支持这类能力,就只能单独为根域名配置A记录指向目标域名IP,不能使用CNAME。
还有一种场景,你想要的是页面跳转,而不是域名别名。用户输入 example.net,浏览器地址栏直接变更为 example.com,这种属于URL转发,不属于CNAME。DNS后台里URL转发一般分为显性URL和隐性URL,显性跳转地址栏会变更,隐性跳转地址栏不变,但页面内容取自目标站点。URL转发本质属于HTTP层面的301或302跳转,和DNS解析本身无关。它配置简单,但搜索引擎会判定为跳转,权重传递效果不如CNAME。如果只是希望两个域名都能访问同一个网站,CNAME更合适;旧域名准备停用,所有流量统一导入新域名,301跳转处理会更干净。
CNAME记录有几项限制需要留意。第一,同一主机记录下,CNAME不能和其他类型解析记录共存。blog主机配置CNAME之后,就不能再给blog添加A记录、MX记录或者TXT记录,叠加配置会产生冲突,解析异常。第二,CNAME的目标只能填写域名,不能直接填写IP地址。指向IP地址要使用A记录,不能使用CNAME。第三,避免出现解析循环。A指向B,B又指向A,这种配置会让解析陷入死循环,DNS服务器直接返回报错。第四,如果接入CDN或者第三方建站平台,平台一般会要求添加CNAME记录指向平台提供的域名,这时不要自行修改成A记录,CDN节点IP会动态变更,A记录无法适配,CNAME才能让CDN完成调度。
验证记录是否生效,可以使用 dig 或者 nslookup 命令。Windows系统打开命令提示符,输入 nslookup blog.example.com,查看返回的规范名称是否等于设置的目标域名。如果返回目标域名对应的IP,代表CNAME已经生效。如果提示“不存在的域”或者服务器查找失败,大概率是TTL缓存没有过期,或是记录填写有误。等待一段时间重试,也可以更换公共DNS服务器检测,例如 nslookup blog.example.com 8.8.8.8。
最后要注意,被指向的目标域名本身必须能够正常解析。如果目标域名没有配置A记录,或是它的DNS服务故障,你的CNAME记录也会失效。配置之前先确认目标域名解析正常,不要把别名指向无法访问的域名。