RRSet de type CNAME avec nom DNS foo.com. n'est pas autorisé à l'apex dans la zone bar.com

Je possède foo.com et bar.com . Je gère les deux à la Route53. foo.com héberge mon site, et j'aimerais diriger le trafic de bar.com à foo.com . J'ai essayé de mettre en place un CNAME record pour bar.com pointant vers foo.com , mais j'ai eu le message d'erreur:

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

pourquoi ça ne marche pas, et que puis-je faire à la place?

72
demandé sur fredley 2013-11-26 15:22:39

5 réponses

selon RFC1912 section 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

le RFC est parfaitement logique car le serveur de noms ne saurait pas s'il doit suivre le CNAME ou répondre avec l'enregistrement réel avec lequel le CNAME chevauche. bar.com est une zone donc elle a implicitement un enregistrement SOA pour le nom bar.com . Vous ne pouvez pas avoir à la fois un enregistrement SOA et un CNAME avec le même nom.

cependant, étant donné que les enregistrements SOA sont généralement utilisés uniquement pour la zone entretien, ces situations où vous voulez fournir un CNAME à l'apex de la zone sont assez fréquents. Même si la RFC l'interdit, de nombreux ingénieurs souhaiteraient un comportement tel que: "suivre le CNAME à moins que la requête ne demande explicitement l'enregistrement SOA". C'est pourquoi la Route 53 fournit alias records . Il s'agit d'une caractéristique spécifique de la Route 53 qui offre la fonctionnalité exacte dont vous avez besoin. Regardez http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html

62
répondu Ioan Alexandru Cucu 2016-04-18 23:22:17
  1. créer un seau S3 appelé bar.com . (Le nom doit être le même que celui du domaine que vous souhaitez rediriger pour que cela fonctionne!)
  2. dans le seau bar.com S3 passez à Properties > Static Website Hosting , sélectionnez Redirect all requests to another host name et entrez foo.com dans la zone de texte.
  3. de retour sur la Route 53 , dans votre Hosted Zone pour bar.com , cliquez sur Create Record Set . Sélectionnez A - IPv4 address pour le type. Cliquez sur Yes pour Alias . Cliquez sur la zone de texte pour Alias Target . bar.com devrait figurer sous -- S3 Website Endpoints -- . Enregistrez le disque. Attendez quelques minutes et vous devriez avoir une configuration de redirection pour rediriger les requêtes de bar.com pour foo.com.

vous pouvez utiliser cette même méthode pour rediriger un domaine nu vers un sous-domaine (comme www). Je l'utilise dans les cas où www.foo.com doit être un CNAME donc je redirige de foo.com pour www.foo.com avec cette même méthode. Si foo.com est un un enregistrez, vous pouvez utiliser cette technique pour rediriger de www.foo.com pour foo.com.

NOTE: Cette méthode va de l'avant avec le chemin complet. c'est-à-dire http://bar.com/test passera à http://foo.com/test .

42
répondu Rob Eroh 2015-11-20 01:20:09

sur la Route53, vous devez créer un enregistrement A et non un enregistrement CNAME , et créer un alias sous cet enregistrement.

du commentaire de @ewalshe sur la réponse D'Alexandru Cucu, si vous êtes venu ici en essayant de configurer API Gateway avec un nom de domaine personnalisé et avoir une url de distribution Cloudfront.

2
répondu Jonathan 2017-09-04 19:23:22

vous devez utiliser le nom au lieu d'un CNAME. Un disque CNAME ne peut rediriger le label que vers un autre label.

lorsque vous parlez de rediriger des noms de domaines au lieu de labels, vous devez utiliser DNAME

$ORIGIN bar.com
           IN      DNAME   foo.com

cela signifie également que chaque enregistrement A, NS et tout autre enregistrement doit être supprimé. Cela doit être configuré dans le foo.com domaine.

1
répondu BlahBlah 2014-10-09 21:27:40

tldr; vous devez passer dans un FQDN comme le nom ResourceRecordSet.

j'ai eu ce même problème en utilisant cette déclaration 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);
        }

dans ce cas image.Nom = = "Listener "

une fois que je l'ai changé en:

 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);
        }

maintenant la valeur transmise est: "Listener.fully.qualified.com "

ça marche maintenant.

1
répondu Wjdavis5 2016-02-23 19:42:17