wandres.dev
ROUTING Y DOMINIOS · workers.dev y custom

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.

⏱ 14 min

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.

🎯 Al terminar esta lección sabrás
  • 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.

📝
Coincidencia exacta de hostname

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.

El custom domain convierte tu Worker en un origen de primera clase

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.

⚔️ Conecta y contrasta
  1. Declara un custom domain para un Worker con custom_domain: true y comprueba que Cloudflare creó el registro de DNS por ti.
  2. Verifica que el certificado del hostname se emitió sin que hicieras nada.
  3. Manda una petición a dos rutas distintas del hostname, /a y /b, y confirma que ambas ejecutan el mismo Worker.
  4. Explica con tus palabras por qué un Worker en custom domain es llamable por fetch() desde la misma zona y uno en route no.