具有DNS名称foo.com的CNAME类型的RRSet。区域bar.com中的顶点不允许

时间:2013-11-26 11:22:39

标签: amazon-web-services dns amazon-route53

我拥有foo.combar.com。我在Route53管理两个。 foo.com托管我的网站,我希望将bar.com的流量引导至foo.com。我尝试为CNAME指定bar.com设置foo.com条记录,但收到错误消息:

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

为什么这不起作用,我该怎么做呢?

6 个答案:

答案 0 :(得分:70)

根据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

答案 1 :(得分:51)

  1. 创建一个名为bar.com的S3 Bucket。 (该名称必须与您要重定向的域名相同才能使其正常工作!)
  2. bar.com S3 Bucket中转到Properties> Static Website Hosting,选择Redirect all requests to another host name并在文本框中输入foo.com
  3. 返回路线53,在Hosted Zone的{​​{1}}中,点击bar.com。选择Create Record Set作为类型。点击A - IPv4 address的{​​{1}}。点击Yes的文本框。 Alias应列在Alias Target下。保存记录。等待几分钟,您应该有一个重定向设置,将请求从bar.com重定向到foo.com。
  4. 您可以使用相同的方法将裸域重定向到子域(如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

答案 2 :(得分:5)

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

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

答案 3 :(得分: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”

现在有效。

答案 4 :(得分:0)

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

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

$ORIGIN bar.com
           IN      DNAME   foo.com

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

答案 5 :(得分:0)

乔纳森的回答是正确的。如果你仍然对他的回答感到困惑,请看一下这个例子。

enter image description here