ChatGPT解决这个技术问题 Extra ChatGPT

CNAME 类型的 RRSet,DNS 名称为 foo.com。不允许在区域 bar.com 的顶点

我拥有 foo.combar.com。我在 Route53 中管理两者。 foo.com 托管我的网站,我想将流量从 bar.com 引导到 foo.com。我尝试为指向 foo.combar.com 设置 CNAME 记录,但收到错误消息:

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

为什么这不起作用,我能做些什么呢?


I
Ioan Alexandru Cucu

根据 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


在 Route 53 中创建记录以便将域顶点定向到经典 ELB 时,您创建 A 记录而不是 CNAME 的别名。可在此处找到详细说明:docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
@ewalshe 可能会将此作为答案以提供更多可见性?
但是 CNAMES 不应该掩盖其他域吗?即 foo.com 到 bar.com,但用户的浏览器仍会显示 foo.com?我会搜索什么功能?
我的 SSL 证书已过期,AWS 通过电子邮件发送给我为我拥有的主机创建 CNAME,但我已经有 A 记录,现在该怎么办?
@eugene 我假设您指的是 AWS 的基于 DNS 的域所有权验证:docs.aws.amazon.com/acm/latest/userguide/… 如果是这种情况,那么亚马逊会要求您为您声称拥有的域的子域添加一个 CNAME。他们要求您创建的 CNAME 中的第一个标签是随机生成的,因此它与任何其他记录重叠应该没有问题。
R
Rob Eroh

创建一个名为 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


当 AWS Route 53 显示可用的链接时,我发现我的 s3 存储桶名称未加载。我在某处读到,您将其创建为哪个 AWS 控制台用户以及可能是哪个区域可能很重要......
foo.com/test 对我有用,但访问 bar.com/test 会给我一个 AccessDenied 错误。有人有建议吗?我无法更改 shell bar.com 帐户上的存储桶策略。
@bjm88 - 你的问题可能和我的一样。您必须创建一个名称为“example.com”的新存储桶!我的存储桶是 dev-portfolio,我必须重新创建一个新存储桶并将其命名为 myName.com,然后它才能工作。
J
Jonathan

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

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


我有 A 记录,证书更新失败,aws 给我发电子邮件建议创建 CNAME ...该怎么办?
s
surga

乔纳森的回答是正确的。如果您仍然对他的回答感到困惑,请查看此示例。

https://i.stack.imgur.com/VJ6OG.png


W
Wjdavis5

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”

现在可以了。


s
stevec

请注意,如果您忘记在“记录名称”字段中输入内容,可能会发生此错误。

也就是说,它可能需要 www,如果您忘记了,即使其他一切都正确,您也会看到错误。

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


B
BlahBlah

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

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

$ORIGIN bar.com
           IN      DNAME   foo.com

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


DNAMERFC 2672 中定义。您能解释一下这与 OP 有何关系吗? Route53 不允许 SOA 或 NS 记录删除,至少从标准界面和 DNAME 不是可用选项。
route53 中没有 DNAME

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅