我拥有foo.com
和bar.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.
为什么这不起作用,我能做些什么呢?
我拥有foo.com
和bar.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.
为什么这不起作用,我能做些什么呢?
根据 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
. (该名称必须与您要从中重定向的域相同才能正常工作!)bar.com
S3 存储桶中转到Properties
> Static Website Hosting
,选择Redirect all requests to another host name
并foo.com
在文本框中输入。Hosted Zone
for 中bar.com
,单击Create Record Set
。选择A - IPv4 address
类型。点击Yes
查看Alias
。单击 的文本框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。
在 Route53 上,您需要创建一个A记录而不是CNAME记录,并在其下创建一个别名。
从@ewalshe 对 Alexandru Cucu 的回答的评论中,如果您来到这里尝试使用自定义域名设置 API 网关并拥有 Cloudfront 分发 url。
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”
现在可以了。
您应该使用 DNAME 而不是 CNAME。CNAME 记录只能将标签重定向到另一个标签。
当您谈论重定向域名而不是标签时,您应该使用 DNAME
$ORIGIN bar.com
IN DNAME foo.com
这也意味着应该删除每个 A、NS 和任何更多记录。这必须在 foo.com 域中进行配置。