RRSet типа CNAME с именем DNS foo.com. не разрешается на вершине в зоне 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.

Почему это не работает, и что я могу сделать вместо этого?

Ответ 1

В соответствии с разделом 2.4 RFC1912:

 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 - это зона, поэтому она неявно имеет запись SOA для имени bar.com. У вас не может быть как SOA-запись, так и CNAME с тем же именем.

Однако, учитывая, что записи SOA обычно используются только для обслуживания зоны, такие ситуации, когда вы хотите предоставить CNAME на вершине зоны, довольно распространены. Несмотря на то, что RFC запрещает это, многие инженеры хотели бы такого поведения, как: "следовать CNAME, если запрос явно не запрашивает запись SOA". Вот почему Route 53 предоставляет alias records. Это специальная функция Route 53, которая предлагает вам точные функции. Посмотрите http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

Ответ 2

  • Создайте ведро S3 с именем bar.com. (Имя должно быть таким же, как домен, для которого вы хотите перенаправить, чтобы это работало!)
  • В тэге bar.com S3 перейдите к Properties > Static Website Hosting, выберите Redirect all requests to another host name и введите foo.com в текстовое поле.
  • Вернитесь в Route 53, в Hosted Zone для 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.

Ответ 3

Вы должны использовать DNAME вместо CNAME. Запись CNAME может перенаправлять ярлык только на другую метку.

Когда вы говорите о перенаправлении имен доменов вместо ярлыков, вы должны использовать DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

Это также означает, что все A, NS и любые другие записи должны быть удалены. Это необходимо настроить в домене foo.com.

Ответ 4

TL;DR; Вы должны передать полное доменное имя в качестве имени ResourceRecordSet.

У меня была эта же проблема, используя этот оператор С# 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"

Теперь он работает.

Ответ 5

В Route53 вам нужно создать запись A NOT a CNAME, и создать под ним псевдоним.

От @walshe комментировать ответ Александру Куку, если вы пришли сюда, пытаясь настроить API-шлюз с пользовательским доменным именем и иметь URL-адрес распространения Cloudfront.