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.