我拥有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.
为什么这不起作用,我该怎么做呢?
答案 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)
bar.com
的S3 Bucket。 (该名称必须与您要重定向的域名相同才能使其正常工作!)bar.com
S3 Bucket中转到Properties
> Static Website Hosting
,选择Redirect all requests to another host name
并在文本框中输入foo.com
。Hosted Zone
的{{1}}中,点击bar.com
。选择Create Record Set
作为类型。点击A - IPv4 address
的{{1}}。点击Yes
的文本框。 Alias
应列在Alias Target
下。保存记录。等待几分钟,您应该有一个重定向设置,将请求从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。
答案 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)