Pasé una tarde configurando lo que debería haber sido una página personal simple en Cloudflare Workers con dominio propio. Funcionó — pero no antes de toparme con tres problemas que ningún tutorial mencionó. Este post documenta exactamente qué falló y cómo lo resolví, para que no pierdas el mismo tiempo.
El stack
Nada exótico:
- Cloudflare Workers — sirve el HTML directamente desde el edge, sin servidor de origen
- Wrangler — despliega el Worker desde la terminal
- Dominio propio registrado y administrado en Cloudflare Registrar
El Worker en sí es simple: un handler fetch que retorna un string HTML con Content-Type: text/html. Sin framework, sin build step, sin bucket S3.
js// src/worker.js
export default {
async fetch(request, env, ctx) {
return new Response(HTML, {
headers: {
"Content-Type": "text/html;charset=UTF-8",
"Cache-Control": "public, max-age=3600",
},
});
},
};
El deploy es un solo comando:
bashnpx wrangler deploy
Eso te da una URL funcional en tu-worker.workers.dev. Lo difícil es conectar tu propio dominio.
Problema 1: El dominio apex no es un "Custom Domain"
Cloudflare Workers te permite agregar Custom Domains en Workers & Pages → tu worker → Domains. Escribes tu dominio y él conecta todo automáticamente.
El problema: no acepta dominios apex (tudominio.com). Solo acepta subdominios (www.tudominio.com, blog.tudominio.com, etc.).
Si intentas escribir tudominio.com en el campo de Custom Domain, obtienes:
Only domains active on your Cloudflare account can be added.
Lo cual es confuso porque tu dominio SÍ está activo en tu cuenta. La razón real es que los dominios apex no pueden tener CNAME — es una limitación de la especificación DNS, no un bug de Cloudflare.
La solución: Agrega www.tudominio.com como Custom Domain. Cloudflare crea el registro DNS del Worker automáticamente. Luego maneja el apex por separado.
Problema 2: La ruta wildcard rompió todo
Mientras intentaba cubrir el apex, agregué una Route: *.tudominio.com/*. La intención era capturar todos los subdominios y enrutarlos al Worker.
Esto rompió tanto www como el apex. El Worker dejó de responder — curl hacía timeout en el puerto 443.
El motivo: la ruta wildcard interceptaba los requests antes de que el mapeo de Custom Domain pudiera procesarlos, y como *.tudominio.com/* no hace match con el apex, el apex quedó sin handler.
La solución: Eliminar la ruta wildcard por completo. Routes y Custom Domains entran en conflicto cuando se superponen. Usa uno u otro, no ambos.
Problema 3: El registro DNS del apex
Sin la ruta wildcard, www.tudominio.com funcionaba pero tudominio.com seguía retornando NXDOMAIN o un 522.
El problema: el DNS tenía un CNAME para el apex apuntando a la página de parking por defecto de Cloudflare. Ese registro bloqueaba al Worker para que no pudiera tomar control del apex.
La secuencia que funcionó:
- Eliminar el CNAME de parking para
@ - Cloudflare crea automáticamente un registro DNS de tipo
Workerpara el apex - Agregar
www.tudominio.comcomo Custom Domain — esto crea su propio registro Worker parawww
Estado final del DNS
| Tipo | Nombre | Contenido | Proxy |
|---|---|---|---|
| Worker | tudominio.com |
tu-worker | ✅ On |
| Worker | www |
tu-worker | ✅ On |
| MX | tudominio.com |
mail server | ⬜ Off |
| TXT | tudominio.com |
SPF record | ⬜ Off |
Qué haría diferente
- Empezar con
wwwcomo primario. Agrégalo como Custom Domain primero, verifica que funciona, luego lidia con el apex. - No tocar Routes a menos que tengas una necesidad específica de enrutamiento. Para un sitio simple de un solo Worker, los Custom Domains son suficientes.
- Eliminar el CNAME de parking temprano. Bloquea al Worker de reclamar el apex y los mensajes de error no lo hacen obvio.
El resultado
Una página estática servida desde el edge de Cloudflare en ~50ms globalmente, sin servidor de origen, sin mantenimiento y con $0 de hosting. El único costo es el registro del dominio.
El enfoque con Workers está subestimado para sitios personales. Tienes control total sobre la respuesta — headers, caché, lógica de enrutamiento — sin gestionar ninguna infraestructura.
Próximo post: agregar un blog a un Cloudflare Worker sin CMS.