Routes: patrones que interceptan tráfico
Cómo mapear un patrón de URL como ejemplo.com/api/* a un Worker, el papel de los comodines, la regla de prioridad por especificidad y el truco de las rutas vacías para excluir tráfico.
Una route responde a una pregunta distinta que un custom domain: no “de quién es este hostname”, sino “qué parte del tráfico de esta zona debe atender mi Worker”. Es un patrón que se compara contra cada URL entrante y, cuando encaja, desvía la petición a tu código. Dominar su sintaxis —comodines, especificidad, exclusiones— es lo que te deja componer varios Workers y un origen tradicional sobre un mismo dominio sin que se pisen entre ellos.
- Leer y escribir patrones de route con hostname y ruta.
- Usar comodines para capturar subdominios y sub-rutas.
- Aplicar la regla de prioridad: gana el patrón más específico.
- Excluir tráfico con rutas vacías, sin Worker asignado.
Anatomía de un patrón
Un patrón de route es hostname/ruta, sin esquema. La parte del hostname puede llevar un comodín de subdominio; la de la ruta, un comodín de cola. El ejemplo canónico:
{
"name": "api",
"main": "src/index.ts",
"compatibility_date": "2026-07-03",
"routes": [
{ "pattern": "ejemplo.com/api/*", "zone_name": "ejemplo.com" }
]
}
Ese patrón manda a tu Worker todo lo que cuelgue de /api/, y deja intacto el resto del sitio. El patrón no incluye el esquema ni el puerto: casa igual con http y con https, y se compara contra la URL ya normalizada.
Hay tres formas de declarar la route, según cómo identifiques la zona:
{
"routes": [
{ "pattern": "ejemplo.com/api/*", "zone_name": "ejemplo.com" },
{ "pattern": "tienda.com/*", "zone_id": "abc123..." },
"app.ejemplo.com/*"
]
}
Una route solo se evalúa si la petición llega al edge de Cloudflare, y eso exige que el hostname tenga un registro de DNS proxied. Si el registro no existe o está en modo DNS-only, la petición nunca entra al pipeline y tu route no se dispara. Es el error número uno con routes; la última lección de este nivel lo explica a fondo.
Comodines: subdominios y rutas
El comodín * casa con cualquier secuencia de caracteres. Combinándolo en las dos posiciones, hostname y ruta, cubres casos muy distintos:
Toda la zona
*/* captura absolutamente todo el tráfico de la zona: cualquier hostname y cualquier ruta. Es la red más amplia posible.
Todos los subdominios
*.ejemplo.com/* casa con cualquier subdominio y cualquier ruta, pero requiere un registro de DNS que resuelva esos subdominios hacia el edge.
Una sub-ruta
ejemplo.com/api/* limita la interceptación a un prefijo de ruta. El resto del dominio sigue su curso normal hacia el origen.
Una ruta exacta
ejemplo.com/salud sin comodín casa solo con esa ruta concreta. Útil para exponer un endpoint puntual.
El comodín de subdominio suele acompañarse de un registro de DNS también comodín. Por ejemplo, para capturar todos los subdominios con un solo Worker:
{
"routes": [
{ "pattern": "*.ejemplo.com/*", "zone_name": "ejemplo.com" }
]
}
Prioridad: gana el más específico
Cuando varias routes podrían casar con una misma URL, Cloudflare aplica una regla simple y determinista: el patrón más específico gana. Un patrón más largo y menos comodinado tiene prioridad sobre uno más amplio.
flowchart TD
A[Peticion entrante] --> B{Que patrones casan}
B --> C[Patron amplio de toda la zona]
B --> D[Patron de una sub ruta]
B --> E[Patron mas fino y exacto]
E --> F[Gana el mas especifico y corre su Worker]Esto te permite estratificar: una route ancha */* hacia un Worker general y una fina ejemplo.com/api/pagos/* hacia un Worker especializado; la fina se impone justo donde aplica y la ancha recoge todo lo demás.
Piensa en la especificidad como en las capas de una cebolla: cada patrón más concreto recorta un hueco dentro del anterior. Diseñar el enrutado es, en el fondo, ordenar esos huecos de lo general a lo particular.
Rutas vacías para excluir
El complemento natural de la prioridad es la exclusión. En el panel puedes registrar una route más específica y dejar su Worker en “None”: el tráfico que casa con ella se salta cualquier route más amplia y sigue su curso normal hacia el origen. Es la forma de decir “todo a mi Worker, excepto esto”.
Por ejemplo, sobre una zona que manda todo con */* a un Worker, una route api.ejemplo.com/* con Worker en “None” devuelve el control de ese subdominio al backend tradicional. Como la segunda es más específica, se impone sobre la comodín amplia. Es el patrón habitual en plataformas que sirven a muchos clientes con un solo Worker y reservan sus propios hostnames.
Un Worker en route no es un origen direccionable. Si necesitas que llame a otro Worker de la misma zona, no basta un fetch(): Cloudflare lo bloquea para evitar bucles. La vía correcta es un service binding, que conecta ambos Workers de forma directa y sin salir a la red.
La route encarna un modelo mental muy distinto al del custom domain, y confundirlos es la raíz de la mayoría de los fallos de enrutado. Una route no posee el hostname ni crea infraestructura: es una regla de coincidencia que Cloudflare evalúa sobre el tráfico que ya entra a una zona. De ahí se derivan sus tres verdades incómodas. La primera: sin un registro de DNS proxied en el hostname, la petición no llega al edge y la route jamás se evalúa; la route describe qué hacer con el tráfico, pero es el DNS quien decide si ese tráfico entra. La segunda: cuando varios patrones casan, no se ejecutan en cadena; gana uno solo, el más específico, y ese modelo de especificidad es lo que te deja estratificar Workers y exclusiones sobre un mismo dominio con precisión quirúrgica. La tercera: como la route vive dentro del pipeline de la zona, un Worker en route no es un origen direccionable, y por eso hablar con él desde otro Worker de la misma zona exige un service binding. Interiorizar esto convierte el enrutado de un misterio —por qué no corre mi Worker— en un cálculo: hay DNS proxied, cuál es el patrón más específico que casa, es un origen o un filtro. Responde esas tres preguntas y sabrás siempre qué Worker atiende cada URL.
- Registra una route
ejemplo.com/api/*y confirma que solo las URLs bajo/api/ejecutan tu Worker. - Añade una route más ancha y otra más fina que casen con la misma URL; verifica cuál gana.
- Provoca el fallo: crea una route sobre un hostname sin registro proxied y observa que el Worker no se dispara.
- Diseña, sobre papel, un esquema
*/*hacia un Worker con una exclusión paraadmin.ejemplo.com.