我拥有 foo.com
和 bar.com
。我在 Route53 中管理两者。 foo.com
托管我的网站,我想将流量从 bar.com
引导到 foo.com
。我尝试为指向 foo.com
的 bar.com
设置 CNAME
记录,但收到错误消息:
RRSet of type CNAME with DNS name foo.com. is not permitted at apex in zone bar.com.
为什么这不起作用,我能做些什么呢?
根据 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
创建一个名为 bar.com 的 S3 存储桶。 (该名称必须与您要从中重定向的域相同才能使其正常工作!)在 bar.com S3 存储桶中,转到“属性”>“静态网站托管”,选择“将所有请求重定向到另一个主机名”并输入 foo。 com 在文本框中。返回 Route 53,在 bar.com 的托管区域中,单击创建记录集。选择 A - IPv4 地址作为类型。为别名单击是。单击别名目标的文本框。 bar.com 应列在 -- S3 网站端点 -- 下。保存记录。等待几分钟,您应该有一个重定向设置来将请求从 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。
在 Route53 上,您需要创建一个 A 记录而不是 CNAME 记录,并在其下创建一个别名。
从@ewalshe 对 Alexandru Cucu 的回答的评论中,如果您来到这里尝试使用自定义域名设置 API 网关并拥有 Cloudfront 分发 url。
A
记录,证书更新失败,aws 给我发电子邮件建议创建 CNAME
...该怎么办?
乔纳森的回答是正确的。如果您仍然对他的回答感到困惑,请查看此示例。
https://i.stack.imgur.com/VJ6OG.png
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”
现在可以了。
请注意,如果您忘记在“记录名称”字段中输入内容,可能会发生此错误。
也就是说,它可能需要 www
,如果您忘记了,即使其他一切都正确,您也会看到错误。
这是一个很小的机会,但如果您忘记在“记录名称”字段中输入 www
,请执行此操作,一切都会正常进行。
您应该使用 DNAME 而不是 CNAME。 CNAME 记录只能将标签重定向到另一个标签。
当您谈论重定向域名而不是标签时,您应该使用 DNAME
$ORIGIN bar.com
IN DNAME foo.com
这也意味着应该删除每个 A、NS 和任何更多记录。这必须在 foo.com 域中进行配置。
DNAME
在 RFC 2672 中定义。您能解释一下这与 OP 有何关系吗? Route53 不允许 SOA 或 NS 记录删除,至少从标准界面和 DNAME 不是可用选项。
DNAME
不定期副业成功案例分享
A
记录,现在该怎么办?