在 zone bar.com 中,不允许类型为 CNAME 且 DNS 名称为 foo.com 的 RRSet

我拥有 foo.combar.com。我在53号公路上管理这两个地方。foo.com主机我的网站,我想直接交通从 bar.comfoo.com。我试图为指向 foo.combar.com建立一个 CNAME记录,但是我得到了错误消息:

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

为什么这样不行,我能做什么呢?

138593 次浏览

根据 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,但许多工程师还是希望采取这样的行为: “遵循 CNAME,除非查询明确要求提供 SOA 记录”。这就是为什么53号公路提供 alias records。这些是53号公路特有的功能,提供您所需要的确切功能。看看 http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

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

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

$ORIGIN bar.com
IN      DNAME   foo.com

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

  1. 创建一个名为 bar.com的 S3桶。(名称必须与要重定向的域相同,这样才能正常工作!)
  2. bar.comS3Bucket 中,转到 Properties > Static Website Hosting,选择 Redirect all requests to another host name并在文本框中输入 foo.com
  3. 回到53号公路,在 Hosted Zonebar.com中,单击 Create Record Set。为类型选择 A - IPv4 address。为 Alias单击 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

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

我在使用这个语句 c # nip 时遇到了同样的问题:

 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”

现在可以用了。

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

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

乔纳森的答案是正确的。如果你仍然与他的答案混淆,请看看这个例子。

enter image description here

请注意,此错误可能发生 如果您忘记在“ < em > Record Name ”字段中输入某些内容

也就是说,它可能期望的是 www,如果您忘记了这一点,您将看到错误,即使其他所有内容都是正确的。

这是一个很小的机会,但是如果您忘记在“记录名称”字段中输入 www,请执行该操作,一切都将正常运行。