140

我拥有foo.combar.com。我在 Route53 中管理两者。foo.com托管我的网站,我想将流量bar.comfoo.com. 我试图设置指向的CNAME记录,但收到错误消息:bar.comfoo.com

RRSet of type CNAME with DNS name foo.com. is not permitted at apex in zone bar.com.

为什么这不起作用,我能做些什么呢?

4

6 回答 6

116

根据 RFC1912 第 2.4 节:

 A CNAME record is not allowed to coexist with any other data.  In
 other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you
 can't also have an MX record for suzy.podunk.edu, or an A record, or
 even a TXT record.  Especially do not try to combine CNAMEs and NS 
 records like this!:

           podunk.xx.      IN      NS      ns1
                           IN      NS      ns2
                           IN      CNAME   mary
           mary            IN      A

RFC 非常有意义,因为名称服务器不知道它是否需要遵循 CNAME 或使用 CNAME 重叠的实际记录来回答。bar.com是一个区域,因此它隐含地具有bar.com名称的 SOA 记录。您不能同时拥有同名的 SOA 记录和 CNAME。

但是,鉴于 SOA 记录通常仅用于区域维护,因此您希望在区域的顶点提供 CNAME 的情况很常见。尽管 RFC 禁止它,但许多工程师希望这样的行为:“遵循 CNAME,除非查询明确要求 SOA 记录”。这就是 Route 53 提供alias records. 这些是 Route 53 的特定功能,可提供您所需的确切功能。看看http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

于 2013-11-27T00:18:55.180 回答
69
  1. 创建一个名为bar.com. (该名称必须与您要从中重定向的域相同才能正常工作!)
  2. bar.comS3 存储桶中转到Properties> Static Website Hosting,选择Redirect all requests to another host namefoo.com在文本框中输入。
  3. 回到 Route 53,在您的Hosted Zonefor 中bar.com,单击Create Record Set。选择A - IPv4 address类型。点击Yes查看Alias。单击 的文本框Alias Targetbar.com应列在 下-- S3 Website Endpoints --。保存记录。等待几分钟,您应该有一个重定向设置来将请求从 bar.com 重定向到 foo.com。

您可以使用相同的方法将裸域重定向到子域(如 www)。我在 www.foo.com 必须是 CNAME 的情况下使用它,因此我使用相同的方法从 foo.com 重定向到 www.foo.com。如果 foo.com 是 A 记录,您可以使用此技术从 www.foo.com 重定向到 foo.com。

注意:此方法将使用完整路径转发。即http://bar.com/test将转发到http://foo.com/test

于 2015-11-20T01:20:09.933 回答
17

在 Route53 上,您需要创建一个A记录而不是CNAME记录,并在其下创建一个别名。

从@ewalshe 对 Alexandru Cucu 的回答的评论中,如果您来到这里尝试使用自定义域名设置 API 网关并拥有 Cloudfront 分发 url。

于 2017-09-04T19:23:22.247 回答
2

乔纳森的回答是正确的。如果您仍然对他的回答感到困惑,请查看此示例。

在此处输入图像描述

于 2021-07-10T08:41:17.357 回答
1

tldr; 您必须传入一个 FQDN 作为 ResourceRecordSet 名称。

使用此语句 c# snip 我遇到了同样的问题:

 private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image)
        {
            var changeBatch = new ChangeBatch();
            var rRs = new ResourceRecordSet(image.Name, RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} };
            var change = new Change(ChangeAction.UPSERT, rRs);
            changeBatch.Changes.Add(change);
            var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch);
            var response = ec2.ChangeResourceRecordSets(request);
            Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns);
        }

在这种情况下 image.Name == "Listener"

一旦我将其更改为:

 private static void RegisterHostWithDns(IAmazonRoute53 ec2,SynoviaImage image)
        {
            var changeBatch = new ChangeBatch();
            var rRs = new ResourceRecordSet(string.Format("{0}.{1}",image.Name, "testing.foo.bar.com"), RRType.CNAME) {TTL=60,ResourceRecords = new List<ResourceRecord>() { new ResourceRecord(image.PublicDns)} };
            var change = new Change(ChangeAction.UPSERT, rRs);
            changeBatch.Changes.Add(change);
            var request = new ChangeResourceRecordSetsRequest(ConfigurationManager.AppSettings["DnsZoneId"], changeBatch);
            var response = ec2.ChangeResourceRecordSets(request);
            Console.WriteLine("Updated CNAME For {0} setting {1}",image.Name,image.PublicDns);
        }

现在传入的值是:“Listener.fully.qualified.com”

现在可以了。

于 2016-02-23T19:42:17.343 回答
-2

您应该使用 DNAME 而不是 CNAME。CNAME 记录只能将标签重定向到另一个标签。

当您谈论重定向域名而不是标签时,您应该使用 DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

这也意味着应该删除每个 A、NS 和任何更多记录。这必须在 foo.com 域中进行配置。

于 2014-10-09T21:27:40.103 回答