Tema
CNAME y el apex
Los registros A apuntan a direcciones. Pero muchas plataformas modernas (Vercel, Netlify, Shopify, GitHub Pages) no te dan una IP fija: te dan un nombre como cname.vercel-dns.com. Para eso existe el CNAME. Y con él llega una de las reglas más confusas del DNS: "la raíz no puede ser CNAME". Aquí vas a entender por qué, cómo Cloudflare lo resuelve y cómo conectar tu dominio a las plataformas más populares.
Concepto
La analogía: el desvío de llamadas
Un CNAME (Canonical Name, nombre canónico) es un alias: dice "este nombre es en realidad ese otro nombre; ve a preguntar por él".
Es como un desvío de llamadas: marcas al número de la oficina y el sistema te dice "este número se desvía al celular de Ana". Tú no sabes el número final; solo sabes a quién se desvía. Si Ana cambia de celular, el desvío sigue funcionando sin que nadie tenga que actualizar nada.
txt
Consulta: www.mitienda.com, tipo A
www.mitienda.com CNAME mitienda.com ← "pregunta por mitienda.com"
mitienda.com A 203.0.113.10 ← respuesta final
El resolver sigue la cadena y entrega 203.0.113.10A vs CNAME
| A / AAAA | CNAME | |
|---|---|---|
| Apunta a | Una IP | Otro nombre |
| Valor de ejemplo | 203.0.113.10 | mitienda.com, cname.vercel-dns.com |
| Cuándo usarlo | Tienes una IP fija (hosting, VPS) | La plataforma te da un nombre o la IP puede cambiar |
| Si la IP de destino cambia | Tienes que editar el registro | No haces nada: el destino se actualiza solo |
¿Puede ir en la raíz @? | Sí | No (salvo flattening, ver abajo) |
| ¿Puede convivir con otros registros en el mismo nombre? | Sí | No |
Valor de un CNAME: nombre, nunca IP
Un CNAME siempre apunta a un nombre de dominio. CNAME www 203.0.113.10 es un error (muchos paneles ni lo dejan guardar). Si tienes una IP, usa A.
La regla de oro: el CNAME no convive con nadie
Según la especificación del DNS (RFC 1034), si un nombre tiene un CNAME, no puede tener ningún otro registro: ni A, ni MX, ni TXT, ni otro CNAME.
¿Por qué? Porque un CNAME significa "todo lo que preguntes sobre este nombre, pregúntalo allá". Si además hubiera un TXT propio, el resolver no sabría a quién creerle.
txt
✘ MAL (conflicto) ✔ BIEN
CNAME www mitienda.com CNAME www mitienda.com
TXT www "verificacion=123" TXT _verif "verificacion=123"
(o el TXT en otro nombre que pida el servicio)En Cloudflare, si intentas crear un registro que choca con un CNAME existente, te mostrará un error del tipo "An A, AAAA, or CNAME record with that host already exists".
Por qué la raíz no puede ser CNAME
La raíz mitienda.com (el apex) siempre tiene registros obligatorios:
- NS: los nameservers (sin ellos, el dominio no existe).
- SOA: la ficha técnica de la zona.
- Normalmente también MX (correo) y TXT (SPF, verificaciones).
Si pusieras CNAME @ cname.vercel-dns.com, estarías violando la regla anterior: el nombre mitienda.com tendría CNAME y NS, SOA, MX... Imposible.
txt
mitienda.com (apex)
├── NS ana.ns.cloudflare.com ← obligatorio
├── NS bob.ns.cloudflare.com ← obligatorio
├── SOA ... ← obligatorio
├── MX smtp.google.com ← correo
├── TXT v=spf1 ... ← SPF
└── CNAME cname.vercel-dns.com ✘ prohibido: el CNAME no convive con nadieSi un panel te deja poner CNAME en la raíz
Algunos paneles antiguos lo permiten y entonces el correo deja de funcionar de forma intermitente (porque los resolvers siguen el CNAME y ya no encuentran tus MX). Si ves un CNAME en la raíz en un proveedor que no hace flattening, cámbialo por A.
La solución: CNAME flattening, ALIAS y ANAME
Como mucha gente necesita apuntar la raíz a plataformas que solo dan un nombre, los proveedores DNS inventaron un truco: tú escribes un CNAME en la raíz, pero el servidor DNS responde con un A.
txt
Lo que tú configuras en Cloudflare:
CNAME @ mitienda.netlify.app
Lo que hace Cloudflare por dentro, en cada consulta:
1. Resuelve mitienda.netlify.app → 75.2.60.5
2. Responde al mundo: mitienda.com A 75.2.60.5
Lo que ve el mundo: un A normal. Las reglas del DNS se respetan.| Proveedor | Cómo se llama |
|---|---|
| Cloudflare | CNAME flattening (automático en la raíz, en todos los planes) |
| DNSimple, NS1 | ALIAS |
| DNS Made Easy, Easy DNS | ANAME |
| Amazon Route 53 | Alias record (solo hacia recursos de AWS) |
| Netlify DNS, Vercel DNS | Lo hacen solos al usar su DNS |
| cPanel, la mayoría de registradores | No lo soportan: en la raíz usa A |
En Cloudflare es automático
Si en Cloudflare creas CNAME con nombre @, el flattening se aplica solo. Verás el registro como CNAME en el panel, pero dig mitienda.com A devolverá IP. Además, si el registro está proxied (naranja), lo que responderá serán las IP de Cloudflare. En planes de pago puedes activar el flattening también en subdominios (DNS → Settings → CNAME flattening), aunque casi nunca hace falta.
www vs sin www
Tienes dos nombres: mitienda.com y www.mitienda.com. Ambos deben funcionar, pero uno debe ser el principal y el otro debe redirigir a él (con un 301). Si los dos muestran el sitio sin redirigir, Google los ve como contenido duplicado y las cookies de sesión pueden comportarse raro.
| Opción | A favor | En contra |
|---|---|---|
Sin www (mitienda.com) | Más corto y moderno | La raíz no admite CNAME (resuelto con flattening) |
Con www (www.mitienda.com) | Puede usar CNAME sin trucos; las cookies de la raíz no se mandan a otros subdominios | Más largo de escribir |
Cualquiera está bien. Lo importante es elegir uno y redirigir el otro.
Configuración típica en Cloudflare (sitio en cPanel, principal sin www)
txt
Tipo Nombre Valor Proxy
----------------------------------------------
A @ 203.0.113.10 Proxied (naranja)
CNAME www mitienda.com Proxied (naranja)Y la redirección www → sin www se hace de alguna de estas formas:
- En Cloudflare (recomendado, no toca el servidor): Rules → Redirect Rules (o Rules → Overview → Create rule → Redirect Rule; existe también una plantilla "Redirect from WWW to root"). El nombre de la sección puede variar ligeramente. Lo verás en detalle en Cloudflare a fondo.
- En el servidor con
.htaccess(Apache/cPanel):
apache
# .htaccess en la carpeta pública del sitio
# Redirige www.mitienda.com → mitienda.com conservando la ruta
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.mitienda\.com$ [NC]
RewriteRule ^(.*)$ https://mitienda.com/$1 [R=301,L]La redirección necesita DNS
Para redirigir www, el nombre www tiene que existir en el DNS (y estar en naranja si usas reglas de Cloudflare). Si borras el registro de www, la regla nunca se ejecuta y el visitante ve "no se encuentra el sitio".
Paso a paso: crear un CNAME en Cloudflare
- En dash.cloudflare.com, elige
mitienda.com. - Ve a DNS → Records → Add record.
- Type:
CNAME. - Name:
www(o@para la raíz con flattening). - Target: el nombre de destino, por ejemplo
mitienda.comocname.vercel-dns.com(sinhttps://, sin barras, sin rutas). - Proxy status: depende de la plataforma (ver tabla de abajo).
- Save.
Error común: pegar una URL en el destino
El destino de un CNAME es un nombre, no una URL. Incorrecto: https://mitienda.netlify.app/. Correcto: mitienda.netlify.app.
Apuntar tu dominio a plataformas populares
Los valores siguientes son los que publican estas plataformas al momento de escribir esto. Siempre copia los que te muestre el panel de la plataforma, porque a veces los cambian o te dan uno personalizado.
Vercel
En Vercel: proyecto → Settings → Domains → Add y escribe mitienda.com.
txt
Tipo Nombre Valor Proxy en Cloudflare
-------------------------------------------------------------
A @ 76.76.21.21 DNS only (gris)
CNAME www cname.vercel-dns.com DNS only (gris)Vercel también puede darte un CNAME personalizado (algo como abc123.vercel-dns-017.com); si te lo muestra, úsalo.
Netlify
En Netlify: Domain management → Add a domain.
txt
Tipo Nombre Valor Proxy en Cloudflare
-------------------------------------------------------------
CNAME @ mitienda.netlify.app DNS only (gris) ← flattening
CNAME www mitienda.netlify.app DNS only (gris)(Si tu DNS no hace flattening, Netlify te indica usar A @ 75.2.60.5.)
GitHub Pages
En el repositorio: Settings → Pages → Custom domain, escribe mitienda.com y activa Enforce HTTPS cuando esté disponible.
txt
Tipo Nombre Valor Proxy en Cloudflare
-------------------------------------------------------------
A @ 185.199.108.153 DNS only (gris)
A @ 185.199.109.153 DNS only (gris)
A @ 185.199.110.153 DNS only (gris)
A @ 185.199.111.153 DNS only (gris)
CNAME www tuusuario.github.io DNS only (gris)Opcionalmente, los AAAA 2606:50c0:8000::153 a 2606:50c0:8003::153. El CNAME de www apunta a tuusuario.github.io, sin el nombre del repositorio.
Shopify
En Shopify: Configuración → Dominios → Conectar dominio existente.
txt
Tipo Nombre Valor Proxy en Cloudflare
-------------------------------------------------------------
A @ 23.227.38.65 DNS only (gris)
CNAME www shops.myshopify.com DNS only (gris)¿Naranja o gris con estas plataformas?
| Plataforma | Recomendación | Por qué |
|---|---|---|
| Vercel, Netlify, GitHub Pages | Gris (DNS only) | Ya tienen su propia red global (CDN) y emiten su propio SSL; con naranja puedes tener errores al emitir el certificado o caché duplicada |
| Shopify | Gris | Shopify lo exige para emitir SSL y validar el dominio |
| Tu hosting cPanel o VPS | Naranja | Aquí Cloudflare sí aporta: caché, protección, SSL gratis |
Buena práctica
Agrega un comentario a cada registro en Cloudflare ("Vercel - web principal", "Shopify - tienda"). Dentro de un año, tú o el siguiente desarrollador lo agradecerán.
Cadenas de CNAME
Un CNAME puede apuntar a otro CNAME, que apunta a otro... El resolver los sigue todos:
bash
dig www.mitienda.com +noall +answertxt
www.mitienda.com. 300 IN CNAME tienda-mx.netlify.app.
tienda-mx.netlify.app. 20 IN CNAME apex-loadbalancer.netlify.com.
apex-loadbalancer.netlify.com. 20 IN A 75.2.60.5Funciona, pero cada salto agrega una consulta. Evita cadenas largas hechas por ti mismo, y nunca hagas bucles (a → b y b → a).
Comprobar CNAME
bash
# ¿Es CNAME y a dónde apunta?
dig +short www.mitienda.com CNAME
# Toda la cadena hasta la IP
dig www.mitienda.com +noall +answer
# La raíz con flattening: debe dar IPs, no CNAME
dig +short mitienda.com A
dig +short mitienda.com CNAME # vacío = correcto en la raízpowershell
nslookup -type=CNAME www.mitienda.com 1.1.1.1
nslookup www.mitienda.com 1.1.1.1
# En la salida verás "Aliases: www.mitienda.com" si es un CNAME
Resolve-DnsName www.mitienda.comSi el registro está en naranja
Un CNAME proxied en Cloudflare no se ve como CNAME desde fuera: Cloudflare responde directamente con sus propias IP. Si quieres ver el CNAME real con dig, ponlo en gris temporalmente o revisa el panel.
Casos reales
Caso 1: "Netlify dice que mi dominio no está bien configurado"
Revisa con dig +short mitienda.com A. Si salen IP de Cloudflare (104.21..., 172.67...) es porque el registro está en naranja. Ponlo en gris y espera unos minutos para que Netlify valide y emita su certificado.
Caso 2: "No puedo agregar el TXT de verificación en www"
www ya tiene un CNAME y no puede tener más registros. Revisa qué nombre exacto pide el servicio: casi siempre es en la raíz (@) o en un nombre especial como _vercel o _github-pages-challenge-tuusuario. Lo verás en TXT y verificaciones.
Caso 3: "Quería apuntar mitienda.com/blog a otro servidor"
El DNS solo trabaja con nombres, no con rutas. No existe un registro para /blog. Opciones: usar un subdominio (blog.mitienda.com con su propio registro) o configurar un proxy inverso en el servidor o con Cloudflare Workers.
Ejercicios
- ¿Qué tipo de registro usarías en cada caso? a)
wwwhacia la raíz, b)@hacia un VPS198.51.100.25, c)docshaciamitienda.gitbook.io, d)@haciamitienda.netlify.appen Cloudflare. - Tu compañero tiene
CNAME www mitienda.comy quiere agregarMX www .... ¿Puede? - Escribe la zona para: sitio principal en Vercel (raíz y www), tienda en Shopify en
tienda.mitienda.comy blog en el hosting cPanel203.0.113.10enblog.mitienda.com. Indica naranja o gris. - Explica con tus palabras qué hace el CNAME flattening de Cloudflare.
- ¿Qué está mal en
CNAME tienda https://shops.myshopify.com/?
Ver solución
- a)
CNAME www mitienda.com(o A). b)A @ 198.51.100.25. c)CNAME docs mitienda.gitbook.io. d)CNAME @ mitienda.netlify.app: en Cloudflare se aplica flattening automático. - No: un nombre con CNAME no puede tener otros registros. Tendría que reemplazar el CNAME de
wwwpor A/AAAA (y aun así, recibir correo en@www.mitienda.comes raro; normalmente el MX va en la raíz). - Zona:
txt
Tipo Nombre Valor Proxy
-------------------------------------------------------
A @ 76.76.21.21 Gris (Vercel)
CNAME www cname.vercel-dns.com Gris (Vercel)
CNAME tienda shops.myshopify.com Gris (Shopify)
A blog 203.0.113.10 Naranja (cPanel)(Además, blog.mitienda.com debe agregarse como dominio en cPanel, y tienda.mitienda.com en Shopify.)
- Permite poner un CNAME en la raíz: Cloudflare resuelve el destino por dentro y responde al mundo con registros A/AAAA, así se respeta la regla de que la raíz no puede ser CNAME.
- El destino de un CNAME debe ser un nombre de dominio: sin
https://y sin/al final. Correcto:CNAME tienda shops.myshopify.com.
Resumen
- CNAME = alias: un nombre apunta a otro nombre, nunca a una IP ni a una URL.
- Un nombre con CNAME no puede tener ningún otro registro.
- Por eso la raíz no puede ser CNAME (tiene NS, SOA, MX, TXT).
- CNAME flattening (Cloudflare), ALIAS o ANAME permiten "CNAME en la raíz" respondiendo A por dentro.
- Elige www o sin www como principal y redirige el otro con 301.
- Vercel, Netlify, GitHub Pages y Shopify: copia los valores de su panel y usa nube gris.
- El DNS trabaja con nombres, no con rutas:
/blogno se resuelve con DNS. - Siguiente: Subdominios y puertos: cómo sabe el servidor qué sitio y qué puerto entregar.