2013-11-26 66 views
55

我拥有foo.combar.com。我在Route53管理两个。 foo.com托管我的网站,并且我希望将流量从bar.com指向foo.com。我试图为bar.com指向建立一个CNAME记录foo.com,但我得到的错误信息:类型为CNAME的RRSet,DNS名称为foo.com。不得在区域顶部bar.com

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

为什么不这项工作,和我有什么办法呢?

回答

54

按照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

+5

在Route 53中创建记录以便域顶点指向传统的ELB时,可以为A记录创建别名,而不是创建CNAME。详细的说明可以在这里找到:http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/using-domain-names-with-elb.html – ewalshe

+0

@ewalshe也许使这个答案给这个更多的可见性? – Jonathan

1

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

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

$ORIGIN bar.com 
      IN  DNAME foo.com 

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

36
  1. 创建一个名为bar.com的S3存储桶。 (该名称必须是一样的,你要在为了这个工作重定向域!)
  2. bar.com S3斗去Properties>Static Website Hosting,选择Redirect all requests to another host name,并在文本框中输入foo.com
  3. 回到路线53,在Hosted Zonebar.com,点击Create Record Set。类型选择A - IPv4 addressAlias请点击Yes。单击Alias Target的文本框。 bar.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

+0

当AWS Route 53显示可用的链接时,我发现我的s3存储桶名称未加载。我在某处读到它可能与您创建的AWS控制台用户有关,也可能与哪些区域有关... – bjm88

1

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

我不得不使用此语句C#剪断此相同的问题:

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 == “监听器”

有一次,我把它改为:

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”

它现在有效。

1

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

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