Custom domains: tu dominio es el Worker
Cómo conectar tu propio dominio a un Worker sin tocar DNS ni certificados, por qué Cloudflare crea el registro automáticamente y en qué se diferencia, de fondo, de una route.
Un custom domain es la forma de decirle a Cloudflare “este hostname es mi Worker”. A diferencia del subdominio de pruebas, aquí usas un dominio tuyo —api.ejemplo.com, ejemplo.com— y Cloudflare se encarga de lo tedioso: crea el registro de DNS, emite el certificado y enruta todo el tráfico del hostname a tu código. Entender qué hace por dentro, y en qué se diferencia de una simple route, es lo que te permite elegir la herramienta correcta en vez de pelearte con la que elegiste por inercia.
- Conectar un dominio propio a un Worker con un custom domain.
- Entender qué crea Cloudflare por ti: registro proxied y certificado.
- Distinguir con precisión un custom domain de una route.
- Aprovechar que un custom domain es direccionable como origen.
Conectar un dominio a un Worker
Un custom domain asocia un dominio o subdominio completo de una zona tuya a un Worker. Los requisitos son mínimos: una zona activa en Cloudflare —la última lección de este nivel cierra ese tema— y un Worker que invocar. Desde ese momento, cada petición al hostname, sea cual sea la ruta o los parámetros, ejecuta tu Worker.
La configuración vive en Wrangler como una route marcada con custom_domain:
{
"name": "api-gateway",
"main": "src/index.ts",
"compatibility_date": "2026-07-03",
"routes": [
{ "pattern": "api.ejemplo.com", "custom_domain": true }
]
}
Fíjate en el patrón: es un hostname a secas, sin /* ni comodines. Un custom domain reclama todas las rutas de ese hostname; no es un filtro, es una posesión. Si vienes de una route /* con un registro apuntando a 100::, migrar a un custom domain es la mejora recomendada, porque simplifica DNS y certificado a la vez.
El registro y el certificado, automáticos
Aquí está la diferencia operativa más visible frente a una route: al crear el custom domain, Cloudflare crea por ti el registro de DNS —proxied, apuntando a tu Worker como origen— y emite un certificado para el hostname. No hay AAAA 100:: que recordar ni certificado que renovar a mano.
flowchart LR A[Peticion a api.ejemplo.com] --> B[Registro proxied creado por Cloudflare] B --> C[Edge de Cloudflare] C --> D[Tu Worker actua como origen] D --> E[Respuesta]
Esa gestión automática es la razón por la que un custom domain es lo que quieres para la puerta principal de tu aplicación: DNS y TLS dejan de ser tarea tuya, y no hay un registro placeholder que mantener.
Un custom domain exige coincidencia exacta del hostname y no admite comodines. api.ejemplo.com no captura www.api.ejemplo.com, y ejemplo.com no captura www.ejemplo.com. Para unir la raíz y el www se usa una regla de redirección, no un segundo custom domain.
Custom domain o route: la diferencia que importa
Ambos mandan tráfico a un Worker, pero encarnan dos ideas distintas. La route es un filtro sobre un hostname que ya existe; el custom domain es una declaración de que el hostname es el Worker.
Custom domain: posesión
Toma el hostname entero, crea el DNS y el certificado, y trata al Worker como origen. Ideal cuando el Worker es la aplicación y no hay servidor detrás.
Route: interceptación
Aplica un patrón como ejemplo.com/api/* sobre una zona existente y solo desvía el tráfico que coincide. Necesita que el DNS del hostname ya exista.
Direccionable como origen
A un Worker en custom domain puedes llegar con fetch() desde otro Worker de la misma zona sin service binding. A uno en route, no.
Se apilan
Si app.ejemplo.com y api.ejemplo.com son dos custom domains, el Worker de app puede llamar por fetch() al de api como a cualquier dependencia externa.
Encadenar Workers con un origen real
Como el Worker de un custom domain se comporta como un origen, puedes anteponerle una route y componer dos Workers en la misma petición. El de la route hace de guardián y, si la petición pasa el filtro, la reenvía con fetch(request) al Worker-origen:
flowchart LR
A[Peticion entrante a la ruta auth] --> B[auth-worker en la route]
B --> C{Pasa el control}
C -->|No| D[Responde 401]
C -->|Si| E[fetch request al custom domain]
E --> F[api-worker como origen]{
"routes": [
{ "pattern": "api.ejemplo.com/auth", "zone_name": "ejemplo.com" }
]
}
El encadenamiento es explícito: lo decides tú en el código del guardián, no la plataforma. Es la base de patrones como autenticación centralizada, límites de tasa o registro previo delante de un servicio.
La distinción entre custom domain y route parece administrativa, pero cambia la topología de tu sistema. Una route es una regla de interceptación: se evalúa dentro del pipeline de la zona, y por eso un Worker en route no es “un servidor” al que otro Worker pueda llamar en la misma zona; Cloudflare corta ese fetch para evitar bucles, y necesitas un service binding explícito. Un custom domain, en cambio, registra al Worker como origen: para el resto de la plataforma es indistinguible de un servidor real detrás de ese hostname. Eso tiene tres consecuencias que se explotan en arquitecturas serias. Primero, direccionabilidad: otro Worker de la misma zona puede hacerle fetch() directamente, y los custom domains se apilan como capas de servicios independientes. Segundo, encadenamiento controlado: puedes poner una route de autenticación delante de un custom domain y, con fetch(request), reenviar la petición al Worker-origen solo si pasa el control, componiendo dos Workers en una misma petición. Tercero, gestión cero: al ser un origen registrado, el DNS y el certificado los mantiene la plataforma. Elegir custom domain no es “la versión fácil de una route”; es declarar que ese hostname, con todo su tráfico, ES tu Worker.
Cuándo usar cada uno
Usa un custom domain cuando el Worker es el destino final del hostname: una API, un sitio full-stack, un servicio que no delega en otro backend. Es también lo que quieres para la puerta principal de un producto, por la gestión automática de DNS y TLS.
Usa una route cuando quieres que un Worker intercepte solo una porción del tráfico de un dominio que ya sirve otra cosa; la lección siguiente entra en sus patrones y en cómo decide la prioridad.
- Declara un custom domain para un Worker con
custom_domain: truey comprueba que Cloudflare creó el registro de DNS por ti. - Verifica que el certificado del hostname se emitió sin que hicieras nada.
- Manda una petición a dos rutas distintas del hostname,
/ay/b, y confirma que ambas ejecutan el mismo Worker. - Explica con tus palabras por qué un Worker en custom domain es llamable por
fetch()desde la misma zona y uno en route no.