SEO técnico con Cloudflare Workers
Cómo aplicar cambios de SEO técnico con Cloudflare Workers mediante el controlador fetch, HTMLRewriter, redirecciones en KV, las distintas capas de caché y controles que evitan cloaking o bloqueos accidentales de Googlebot.
Idiomas
1 señal de evidencia en esta página
- Datos de origen enlazadosgooglebot.json
Hacer SEO con Cloudflare Workers significa modificar solicitudes y respuestas en el entorno serverless de Cloudflare. Un Worker solo procesa las rutas que le corresponden y concentra la lógica en un controlador fetch. HTMLRewriter permite insertar una etiqueta canonical, corregir hreflang o añadir JSON-LD sin desplegar el CMS, pero la transformación debe ser idempotente y cubrir HTML ausente, duplicado, malformado o inexistente. Para muchas redirecciones conviene KV o D1; para conjuntos pequeños pueden bastar Bulk Redirects o Redirect Rules, siempre con un único responsable por URL. La API Cache de Workers, la caché perimetral y Cache-Control son capas distintas: diagnostícalas por clave, ubicación, TTL e invalidación. La lógica debe ser idéntica para Googlebot y para las personas, y Bot Fight Mode puede bloquear al rastreador antes de que actúen determinadas reglas del WAF. Registra la versión de cada cambio, prepara una reversión y verifica el resultado con la inspección de URLs de GSC y CF-Cache-Status.
TL;DR — Los Cloudflare Workers son pequeños programas que se ejecutan en la red de Cloudflare, por delante de su sitio web real. Un Worker puede añadir una redirección, corregir una metaetiqueta o inyectar una etiqueta canónica mientras la página pasa por delante, sin tocar su CMS ni esperar a los desarrolladores. Esta página es la versión práctica, a nivel de código, de la idea más amplia de Edge SEO: cómo se hace realmente en Workers en concreto. La única regla que no se puede romper: lo que sea que un Worker cambie, tiene que cambiarlo igual para Google y para los visitantes reales. Mostrarle a Google algo distinto es cloaking.
Qué es un Cloudflare Worker, en términos sencillos
Si su sitio está en Cloudflare, cada solicitud de un visitante (o de Googlebot) pasa por la red de Cloudflare antes de llegar a su servidor real. Un Worker es un pequeño script que puede ejecutar en ese punto del recorrido. Ve la solicitud que entra y la respuesta que sale, y puede modificar cualquiera de las dos. Evidence for this claim Cloudflare Workers run code on Cloudflare's network and can inspect or modify requests and responses. Scope: Cloudflare Workers request handling. Confidence: high · Verified: Cloudflare Workers: How Workers works
Ese es todo el atractivo para el SEO: permite corregir cosas en páginas que de otro modo no se pueden editar. ¿Atrapado en una plataforma cerrada? ¿Esperando semanas a que un desarrollador añada una etiqueta canónica? Un Worker puede hacerlo en minutos, en vivo, sin desplegar nada en el propio sitio.
Para qué se usan los Workers en SEO
- Redirecciones — enviar URLs antiguas a las nuevas en el edge, incluso miles de ellas.
- Corregir o añadir etiquetas — inyectar una etiqueta canónica, corregir un título, añadir hreflang, insertar datos estructurados, todo sin editar el código fuente de la página.
- Reescribir cabeceras — añadir o corregir cosas como
X-Robots-Tag.
La regla que no se puede romper
Haga lo que haga su Worker, tiene que hacerlo para todo el mundo. Si le muestra a Googlebot una página distinta de la que ve una persona real, para manipular los rankings, eso es cloaking, y va contra las normas de Google. Evidence for this claim Google defines serving materially different content to search engines and users to manipulate rankings as cloaking and a spam-policy violation. Scope: Google Search spam policy; legitimate personalization is context-dependent. Confidence: high · Verified: Google: Spam policies — cloaking El patrón seguro es simple: aplicar la misma lógica a cada solicitud, sin importar quién la haga. (El hub de Edge SEO cubre esta regla en profundidad; esta página da por hecho que ya entiende el concepto y quiere el cómo hacerlo específico de Cloudflare.)
Las dos formas de hacerse daño
La mayoría de las historias de “Cloudflare perjudicó mi SEO” no tienen que ver con el código del Worker en absoluto:
- Una configuración de bloqueo de bots. El Bot Fight Mode de Cloudflare puede bloquear o desafiar a Googlebot accidentalmente. Si Google no puede obtener sus páginas, nada más importa.
- Confusión con la caché. Cloudflare tiene más de un tipo de caché, y si no sabe cuál está tocando, un cambio que ha publicado puede parecer que “no aparece”.
¿Quiere el código real —un handler fetch, un ejemplo de HTMLRewriter, una tabla de
redirecciones en KV— además de los detalles de caché y de bloqueo de bots? Cambie a la pestaña Avanzado.
TL;DR — Un Cloudflare Worker solo ve las solicitudes que coinciden con la ruta que tiene configurada, y las intercepta una a una en un único handler
fetch, donde se hacen tres cosas en secuencia: reescribir la solicitud, reescribir las cabeceras de la respuesta y reescribir el cuerpo de la respuesta medianteHTMLRewriter. Ese es el mecanismo real detrás de “inyectar una canónica” o “corregir un título”, y necesita ser idempotente y estar probado frente a respuestas con la etiqueta ausente, duplicada y frente a respuestas que no son HTML, no solo frente al camino feliz. Las redirecciones a escala viven en KV (búsqueda rápida por clave) o en D1 (relacional); Bulk Redirects/Rules cubren conjuntos pequeños de forma más simple, y en general prefiero las redirecciones a nivel de edge frente a las de nivel de servidor, pero elija un único responsable por URL, ya que una redirección de Worker, un Bulk Redirect y una redirección de origen pueden dispararse todas en la misma ruta. Tres cosas distintas comparten la palabra “caché” —la Cache API de Workers (caches.default), la caché del edge de Cloudflare y elCache-Controldel origen— y confundirlas es la causa habitual de “mi etiqueta no aparece”; diagnostique la obsolescencia por clave de caché, capa, TTL e invalidación en lugar de adivinar. La propia guía de Google sobre ETag / If-None-Match / 304 es directamente accionable para un Worker que es dueño de la respuesta. La línea del cloaking: lógica idéntica para cada solicitante. La herida autoinfligida más específica de Workers es el Bot Fight Mode, que se ejecuta fuera del WAF Ruleset Engine, así que las reglas de “allow” ordinarias no lo alcanzan. Publique cada cambio que afecte al SEO con metadatos de versión registrados, un rollback probado y una condición de parada, y después verifique con la herramienta de inspección de URL de GSC yCF-Cache-Status.
Qué es este artículo (y qué no)
Este es el complemento práctico, a nivel de código, del hub de Edge SEO.
El hub es el propietario de la definición general, de la tabla comparativa de plataformas
(Workers, Akamai, Fastly, Lambda@Edge, Vercel, Netlify), de la decisión entre Snippets y
Workers, y del tratamiento completo de la regla del cloaking. No voy a volver a deducir nada
de eso aquí. Esta página baja un nivel más hacia Cloudflare Workers en concreto —el runtime
sobre el que se ejecuta el propio worker de este mismo sitio, conectado mediante
run_worker_first en wrangler.toml— con APIs reales en lugar de vaguedades del tipo “el
edge computing puede inyectar etiquetas”.
Una nota antes del código: Google no tiene documentación específica de Cloudflare Workers. La guía oficial que rige esto (política de cloaking, caché HTTP, rastreo con CDN) es general y se aplica a cualquier implementación en el edge. Prefiero decirlo con claridad antes que dar a entender que existe un documento de Google que no existe.
Cómo se sitúa un Worker en el recorrido de solicitud/respuesta
Un Worker es un script serverless que se ejecuta sobre isolates de V8. Cada solicitud que se
le enruta entra por un handler fetch. Evidence for this claim A Cloudflare Worker receives HTTP requests through a fetch handler. Scope: Cloudflare Workers handlers. Confidence: high · Verified: Cloudflare Workers: Fetch handler “Que se le enruta” hace un trabajo real en esa frase: un
Worker solo ve las solicitudes que coinciden con su
ruta o dominio personalizado
configurado; todo lo demás nunca llega al handler fetch. Cuando dos rutas podrían coincidir
con la misma URL, tiene precedencia el patrón más específico, así que antes de confiar en el
comportamiento de un Worker para una URL dada, confirme que la ruta realmente coincide con ella
y compruebe qué versión desplegada está activa en esa ruta (los entornos de Wrangler y los
despliegues graduales hacen que la versión que sirve el tráfico no siempre sea la que tiene en
su editor). Dentro del handler puede hacer tres cosas distintas, en este orden:
- Reescribir la solicitud antes de que llegue a su origen.
- Reescribir las cabeceras de la respuesta en el camino de vuelta.
- Reescribir el cuerpo de la respuesta, mediante
HTMLRewriter.
Esta es la forma mínima:
export default {
async fetch(request, env, ctx) {
// 1. (optionally) inspect/modify the request
const response = await fetch(request); // hit the origin
// 2. rewrite headers
const headers = new Headers(response.headers);
headers.set("X-Robots-Tag", "index, follow");
// 3. rewrite the body with HTMLRewriter (see next section)
return new Response(response.body, { ...response, headers });
},
};El equipo de SALT.agency, que acuñó el término “edge SEO” a partir de su investigación sobre Cloudflare Workers, construyó sus herramientas como una cadena de filtros: un filtro de solicitud, un filtro de respuesta y un filtro de cuerpo. Es ese mismo patrón de tres fases; simplemente le pusieron nombre. Mantener esas tres fases separadas en la cabeza hace que un Worker resulte legible.
Reescribir HTML con HTMLRewriter
HTMLRewriter es el analizador de HTML en streaming de Cloudflare, y es la API real detrás de
cada truco de “inyectar una etiqueta”. Evidence for this claim Cloudflare HTMLRewriter provides selector-based handlers that can transform streamed HTML elements. Scope: Cloudflare Workers HTMLRewriter API. Confidence: high · Verified: Cloudflare Workers: HTMLRewriter Se registran handlers de elemento
con .on(selector, handler), y el handler recibe getAttribute / setAttribute,
prepend / append, setInnerContent y replace. Como funciona en streaming, no está
almacenando todo el documento en memoria.
Inyectar o corregir una etiqueta canónica
class CanonicalHandler {
constructor(url) { this.url = url; }
element(el) { el.setAttribute("href", this.url); }
}
const rewriter = new HTMLRewriter()
.on('link[rel="canonical"]', new CanonicalHandler("https://example.com/preferred/"));
return rewriter.transform(response);Si la página no tiene ninguna canónica, se adjunta un handler a head y se hace append de
una en lugar de editar una etiqueta existente. En cualquier caso, recuerde la lección del lado
de la canonicalización de esto:
rel=canonical es una sugerencia, no una orden; un Worker permite establecerla de forma
coherente en toda una plataforma, pero Google sigue decidiendo.
El CanonicalHandler anterior da por hecho que ya existe una etiqueta y que la respuesta es
HTML. Ninguna de las dos cosas está garantizada en producción, y equivocarse en esto es como
se acaba con dos etiquetas canónicas en una página en lugar de una. Antes de publicar una
reescritura así, hágala idempotente y pruébela frente a:
- Ninguna etiqueta canonical existente — su controlador necesita detectar el caso ausente y hacer
appendde una enhead, no quedarse sin hacer nada en silencio porquelink[rel="canonical"]no coincide con nada. - Una etiqueta canonical duplicada o malformada ya presente — decida si elimina la etiqueta sobrante o deja que su reescritura añada una segunda (esto último es un error real, no un caso límite: las etiquetas canonical duplicadas son un problema autoinfligido habitual).
- Una respuesta que no es HTML — una ruta de API, una imagen o una respuesta de redirección
que pase por el mismo Worker no debería pasar por
HTMLRewriteren absoluto; limite la transformación a las rutas y tipos de contenido que haya comprobado realmente. - Ejecutar la transformación dos veces sobre la misma respuesta (un reintento, un
fetchanidado) — confirme que no vuelve a añadir una segunda etiqueta.
Añadir o corregir alternativas hreflang
El mismo mecanismo, gobernado por la configuración. Se añade un link[rel="alternate"] por cada
locale a head. Si sus alternativas son por locale y relacionales, esa configuración pertenece a
D1; si es una búsqueda plana, KV está bien. La cuestión es que HTMLRewriter las inyecta de forma
idéntica para cada solicitante: no está ramificando según el agente de usuario.
Inyectar datos estructurados JSON-LD
new HTMLRewriter().on("head", {
element(head) {
head.append(
`<script type="application/ld+json">${JSON.stringify(schema)}</script>`,
{ html: true }
);
},
});Límites de CPU que aprietan a escala
Una afirmación de la competencia que rebatiría es la de “submilisegundo, sin restricciones”. El
techo real es el tiempo de CPU: 10 ms en el plan gratuito, 30 ms en los de pago (el tiempo de
reloj esperando a fetch no cuenta; el tiempo de CPU sí). Para reescrituras típicas nunca lo
notará. Para pasadas pesadas de HTMLRewriter sobre páginas muy grandes, es una restricción real
que hay que tener en cuenta en el diseño, no alarmismo.
Redirecciones en el edge: KV frente a D1 frente a Rules
Normalmente prefiero tener las redirecciones en el edge (a nivel de CDN) antes que tenerlas en el servidor: descarga el trabajo de su origen y se aplica antes de que la página llegue a generarse. En Cloudflare en concreto, en mi guía de Ahrefs sobre redirecciones para SEO expuse que hay varias opciones: redirecciones individuales o masivas, redirect rules, page rules, o Workers con pares clave-valor, o un Worker que modifica cabeceras para añadir una redirección.
Para una tabla gestionada por un Worker, KV es el hogar natural: una búsqueda de clave rápida y eventualmente consistente, indexada por URL.
export default {
async fetch(request, env) {
const url = new URL(request.url);
const target = await env.REDIRECTS.get(url.pathname); // KV namespace
if (target) return Response.redirect(target, 301);
return fetch(request);
},
};Recurra a D1 cuando las redirecciones sean relacionales (SQL por locale, por segmento, que quiera consultar). Y sepa cuándo un Worker es excesivo: para un conjunto pequeño y estático de redirecciones, los Bulk Redirects de Cloudflare o las Redirect Rules son más simples y no necesitan nada de código. No se fabrique a mano un Worker con KV para cincuenta redirecciones.
Elija un único responsable para una URL dada y no deje que una redirección de Worker, un Bulk Redirect, una Redirect Rule y una redirección de origen se apliquen todos a la misma ruta: son sistemas separados que pueden dispararse cada uno en la misma solicitud, y cuando coincide más de uno, acaba depurando precedencias en lugar de tener una redirección limpia. Antes de añadir una redirección en cualquier sitio, compruebe si ya existe una para esa ruta en los otros sistemas, y elija la capa según la complejidad de la coincidencia (1:1 simple frente a basada en patrones), la escala y quién necesita observarla o revertirla: una redirección de Worker vive en su código y en sus logs; un Bulk Redirect o una Rule vive en el panel y es más fácil de auditar o revertir para alguien que no programa.
Caché: tres cosas distintas, un nombre confuso
Esta es la sección que las páginas de la competencia se saltan, y es la que genera más confusión del tipo “por qué no apareció mi cambio”. Tres capas distintas comparten la palabra caché:
- La Cache API de Workers —
caches.defaultycaches.open(). Es una caché programable de ámbito Worker que se lee y se escribe desde el código. - La caché del edge de Cloudflare — la caché de CDN que sirve sus recursos. Distinta de la Cache API.
- El
Cache-Controldel origen — las cabeceras que establece su origen (o su Worker), que influyen en las dos anteriores y en lo que hace Googlebot.
Confúndalas y jurará que un cambio no se desplegó cuando en realidad se está sirviendo desde una capa que no purgó.
Cuando un cambio realmente no aparece, no adivine: diagnostíquelo capa por capa:
- Clave de caché. ¿Qué atributos de la solicitud determinan si dos solicitudes alcanzan la misma entrada en caché (la URL y, a veces, cabeceras o cookies si su clave de caché las incluye)? Una reescritura que varía según algo que no está en la clave de caché puede servir la variante equivocada.
- Qué capa sirvió la respuesta. Compruebe
CF-Cache-Status(HIT/MISS/EXPIRED/DYNAMIC) para ver si respondió siquiera la caché del edge o si la solicitud llegó a su Worker. - Ubicación/estado. La caché de Cloudflare está distribuida entre centros de datos: una purga o un despliegue nuevo no invalida necesariamente cada ubicación del edge al instante.
- TTL y la regla que lo estableció. Confirme si el TTL lo controla una regla de caché, una
cabecera
Cache-Controlde su origen o una cabecera que estableció el propio Worker. - Invalidación. ¿Purgó la URL concreta, purgó todo o se apoyó en la expiración del TTL? Una
entrada de la Cache API gestionada por el Worker (
caches.default) necesita su propiodelete()explícito: purgar la caché de la CDN no la toca.
Qué hace Googlebot con ETag / If-None-Match / 304
Si su Worker genera o reescribe la respuesta, es dueño de las cabeceras de caché, lo que
significa que la guía de caché HTTP de Google de diciembre de 2024 es directamente accionable para
usted. Google admite el almacenamiento en caché HTTP heurístico mediante ETag/If-None-Match y
Last-Modified/If-Modified-Since,
recomienda encarecidamente ETag
porque es menos propenso a errores, y dice que cuando el ETag del rastreador coincide, su
servidor debería devolver un 304 Not Modified sin cuerpo. Un Worker que genera la respuesta
puede implementar exactamente eso: calcular un ETag, compararlo con If-None-Match y
cortocircuitar él mismo a un 304, ahorrando cómputo y dando a Googlebot una señal rápida y
cacheable.
El compromiso entre max-age y el nuevo rastreo
Google también dice que se plantee establecer Cache-Control: max-age para ayudar a los
rastreadores a decidir cuándo volver a rastrear. La pega para un Worker que reescribe HTML: un
max-age agresivo en una página cuyas etiquetas inyectadas por el Worker acaban de cambiar puede
retrasar que Googlebot vea la actualización que acaba de publicar. No le ponga una vida de caché
larga al HTML reescrito y se olvide.
La frontera del cloaking, aplicada a Workers
La regla dura, en términos de Workers: ejecute la misma lógica para cada solicitante. La política de spam de Google define el cloaking como presentar contenido distinto a usuarios y motores de búsqueda para manipular las posiciones, y señala específicamente insertar texto o palabras clave solo cuando quien solicita es un motor de búsqueda.
Un par de aclaraciones, porque aquí la gente sobrecorrige:
- Inspeccionar el agente de usuario no es automáticamente cloaking. Registrar el tráfico de bots, o servir una respuesta cacheada más rápido a cualquier cliente, está bien. La línea está en una diferencia de contenido según la identidad de quien solicita, hecha para manipular los rankings.
- Las pruebas A/B por división de páginas en Workers están bien. Dividir a los usuarios por URL y tratar igual a cada solicitante es legítimo. Dividir según quién pregunta —bot frente a humano— no lo es.
Un ejemplo práctico del patrón seguro: la propia puerta de preview de este sitio es un Worker que
devuelve un 404 en cualquier ruta /preview/ salvo que una cookie coincida con un secreto.
Devuelve ese 404 a todo el mundo que no tenga la cookie, Googlebot incluido. Esa es exactamente
la forma segura: no está ocultando una cosa a los bots y mostrando otra a los usuarios; aplica una
única regla de manera uniforme.
Y no se apoye en un paso de prerenderizado solo para bots, aunque lo construya de forma limpia sobre Workers. Google ha calificado el renderizado dinámico como una solución provisional y no una solución a largo plazo; un Worker que prerenderiza solo para bots hereda esa obsolescencia.
Cómo un Worker puede bloquear o ralentizar a Googlebot sin querer
Esta es la manera más específica de Workers de dispararse en el pie, y normalmente no está en el código de su Worker.
El Bot Fight Mode se ejecuta fuera del Ruleset Engine
Bot Fight Mode (y Super Bot Fight Mode) puede producir falsos positivos contra rastreadores legítimos, Googlebot incluido. La trampa: el Bot Fight Mode se evalúa en una cadena separada de la del WAF Ruleset Engine, así que sus reglas personalizadas ordinarias de “allow” o “skip” en el WAF no lo anulan. Si el Bot Fight Mode está desafiando a Googlebot, no lo arregla con una regla de allow: tiene que cambiar o desactivar el modo en sí. (Confirme la mecánica actual con la documentación de Cloudflare sobre Bot Fight Mode y Super Bot Fight Mode antes de fiarse de ello: los productos de bots cambian.)
El patrón de regla personalizada para bots verificados
Cloudflare expone un campo cf.client.bot y un
patrón de allow para bots verificados
para que pueda permitir rastreadores conocidos y legítimos en sus reglas personalizadas: útil para
el lado del WAF, aunque (según lo anterior) no alcanza al Bot Fight Mode.
La propia CDN es neutra o positiva
Para dejar claro el mito: Cloudflare como CDN no perjudica el SEO. El propio trabajo de 2024 de
Google en Crawling December
señala que Google aumenta la frecuencia de rastreo cuando detecta una CDN, pero también que una CDN
puede bloquear accidentalmente a Googlebot mediante reglas de WAF o de bots, y que un 503 es
mejor que un intersticial de verificación de bots. El riesgo es un Worker o una configuración de
bots mal configurados, no la infraestructura.
Verificar qué recibió realmente Googlebot
Después de cualquier despliegue de un Worker, confirme qué obtuvo realmente un rastreador; no lo dé por hecho:
- Inspección de URL de GSC → Probar URL publicada. Obtiene la página como Google y muestra el HTML renderizado, para que pueda confirmar que su canónica/hreflang/JSON-LD inyectados están realmente presentes.
- Compruebe
CF-Cache-Statusjunto con el HTML.HIT/MISS/EXPIREDle dice si está viendo una respuesta fresca del Worker o una cacheada: la forma más rápida de detectar un “el cambio no apareció” que en realidad es un problema de capa de caché. - Haga la petición como Googlebot directamente. Solicite con el agente de usuario de Googlebot y compare, pero recuerde que hacer coincidir la cadena no prueba nada sobre la identidad; verifique al Googlebot real con DNS inverso y directo contra los rangos publicados de Google (véase la pestaña Scripts).
Higiene de despliegue específica de Workers
Un wrangler deploy correcto le dice que el script se publicó; no le dice que Googlebot esté
recibiendo la salida renderizada correcta. Trate cada cambio de Worker que afecte al SEO como una
release con registro, no como un simple push:
- Delimite sus rutas. No ejecute un Worker en
/*por defecto. Ajústelo a las rutas que necesita en los patrones de ruta de suwrangler.tomlpara que un fallo no pueda tumbar todo su sitio. - Compruebe los límites actuales antes de prometer escala. El tiempo de CPU, el número de subsolicitudes y los límites de tamaño de script varían según el plan y cambian con el tiempo: confírmelos en la página de límites actuales de Cloudflare antes de diseñar una reescritura en torno a un techo concreto, en lugar de fiarse de un número recordado.
- Registre los metadatos de versión de la release. El modelo de versiones y despliegues de Cloudflare registra la versión de origen, la fecha de compatibilidad, los bindings y las rutas de cada despliegue: anote qué versión está activa en qué ruta para que la afirmación “el Worker hace X” sea comprobable frente a lo que está realmente desplegado, no frente a lo que hay en su editor.
- Versione y haga rollback con los entornos de Wrangler. Publique en un entorno de staging, despliegue gradualmente por porcentaje y conserve la capacidad de volver a la versión anterior al instante.
- Use logs delimitados para monitorizar el despliegue, teniendo en cuenta sus límites. Los Workers Logs de Cloudflare y el seguimiento de logs pueden servir de apoyo para depurar un despliegue gradual, pero los logs se muestrean y se conservan durante una ventana limitada: trátelos como evidencia acotada de las solicitudes que capturaron, no como un registro completo de cada visita de un rastreador.
- Fije una condición de parada y pruebe el rollback antes de necesitarlo. Decida de antemano qué comportamiento observado (tasa de errores, una respuesta incorrecta en una comprobación puntual, una caída de la frecuencia de rastreo) detiene el despliegue, y confirme que la vía de rollback funciona de verdad en lugar de suponer que funcionará.
- Purgue la caché como parte del despliegue. Como hay tres capas de caché en juego, haga de la purga/invalidación de caché un paso explícito de publicar una reescritura, no una ocurrencia tardía.
Una nota sobre Bing y algo con vistas al futuro
Bing tampoco tiene ninguna guía específica de Cloudflare ni del edge. Pero como el despliegue de un Worker es instantáneo mientras que los rastreos no lo son, IndexNow es el complemento natural: dispárelo en el momento en que se publique una tabla de redirecciones o un cambio de etiquetas impulsado por un Worker, para que Bing (y otros motores participantes) vuelvan a rastrear con prontitud. Y merece un vistazo: Cloudflare lanzó la canonicalización aplicada en el edge como una función de producto (“Redirecciones para el entrenamiento de IA”): los rastreadores de entrenamiento de IA verificados reciben una redirección 301 a su URL canonical con un solo interruptor. Es un contraste útil frente a programar a mano la lógica canonical en su propio Worker, y un recordatorio de que “servir a los rastreadores algo distinto de lo que ven los usuarios” es un patrón del que Microsoft se ha mostrado públicamente escéptica en otras funciones de Cloudflare para rastreadores de IA: una buena comprobación de sentido común para cualquier Worker condicionado por bots.
Para el panorama más amplio —la comparación de plataformas, Snippets frente a Workers, los ángulos de cola de desarrollo y de gobernanza— vuelva al hub de Edge SEO.
Resumen con IA
Una versión condensada de la variante Advanced:
- Cloudflare Workers SEO = hacer SEO técnico sobre el runtime de isolates de V8 de Cloudflare. Es la implementación a nivel de código, específica de Workers, del concepto general de Edge SEO — consulte ese hub para la definición, la comparación de plataformas y el tratamiento a fondo del cloaking.
- Un Worker solo ve lo que coincide con su ruta. La configuración de rutas/dominios y su
precedencia deciden qué solicitudes llegan siquiera al handler
fetch: confirme la ruta y la versión desplegada antes de fiarse del comportamiento de un Worker para una URL. - Un handler
fetch, tres fases: reescribir la solicitud, reescribir las cabeceras de la respuesta, reescribir el cuerpo de la respuesta. La reescritura del cuerpo pasa porHTMLRewriter, el mecanismo real para inyectar una canónica, corregir hreflang o añadir JSON-LD. Haga la reescritura idempotente y pruébela frente a respuestas con la etiqueta ausente, duplicada, malformada y frente a respuestas que no son HTML, no solo frente al camino feliz. - Redirecciones: KV para búsquedas rápidas por clave, D1 para configuración relacional, Bulk Redirects/Rules para conjuntos pequeños y estáticos. Patrick prefiere las redirecciones a nivel de edge frente a las de nivel de servidor, pero elija un único responsable por URL; una redirección de Worker, un Bulk Redirect, una Redirect Rule y una redirección de origen pueden dispararse todos en la misma ruta.
- Tres cachés comparten una sola palabra: la Cache API de Workers (
caches.default), la caché del edge de Cloudflare y elCache-Controldel origen; confundirlas provoca el “mi cambio no apareció”. Diagnostíquelo por clave de caché, capa, TTL e invalidación en lugar de adivinar. - La guía de caché ETag/If-None-Match/304 de Google (dic. 2024) es directamente accionable: un
Worker que es dueño de la respuesta puede cortocircuitar él mismo a un 304; pero un
max-ageagresivo puede retrasar el nuevo rastreo de una página que acaba de cambiar. - Regla del cloaking: lógica idéntica para cada solicitante. Inspeccionar el UA no es automáticamente cloaking; lo que sí lo es es una diferencia de contenido según la identidad de quien solicita para manipular los rankings.
- Mayor riesgo autoinfligido: el Bot Fight Mode se ejecuta fuera del WAF Ruleset Engine, así que las reglas de allow normales no lo alcanzan; hay que cambiar el modo en sí.
- Publique con deliberación: compruebe los límites actuales de su plan antes de prometer escala, registre los metadatos de versión (fecha de compatibilidad, bindings, rutas) de cada release, use logs delimitados (muestreados, no un registro completo) para vigilar un despliegue, y fije una condición de parada con un rollback probado antes de necesitarlo.
- Verifique con la inspección de URL de GSC (Probar URL publicada) y la cabecera
CF-Cache-Status; vigile los límites de CPU (10 ms gratuito / 30 ms de pago) en reescrituras pesadas.
Documentación oficial
No existe ningún documento de SEO específico de Cloudflare Workers ni de Google ni de Bing: la guía que lo rige es general. Las fuentes primarias más útiles se reparten entre los motores de búsqueda (política/caché) y Cloudflare (las APIs del runtime).
Google (se aplica a cualquier implementación en el edge)
- Políticas de spam — cloaking — la frontera dura que debe respetar cualquier lógica de un Worker.
- Crawling December: caché HTTP (2024) — ETag / If-None-Match / 304 / max-age, directamente accionable para un Worker que es dueño de la respuesta.
- Crawling December: CDN y rastreo (2024) — cómo afecta una CDN a la frecuencia de rastreo y cómo las reglas de bots pueden bloquear a Googlebot.
- Renderizado dinámico (obsoleto) — por qué un Worker que prerenderiza solo para bots hereda un patrón obsoleto.
- Resumen de los rastreadores y fetchers de Google — agentes de usuario y rangos de IP publicados para la verificación.
Cloudflare (el runtime)
- HTMLRewriter — la API del analizador de HTML en streaming.
- Cache API —
caches.default/caches.open(). - Cómo funciona la caché — la Cache API frente a la caché del edge.
- Rutas y dominios — coincidencia de rutas, precedencia y qué solicitudes invocan realmente a un Worker.
- Bulk Redirects — el sistema de redirecciones sin código con el que una redirección de Worker puede entrar en conflicto o solaparse.
- Límites de Workers — techos actuales de CPU, subsolicitudes y tamaño de script; dependen del plan y de la fecha, así que consúltelos directamente en lugar de fiarse de un número recordado.
- Versiones y despliegues — despliegues versionados/graduales y rollback.
- Workers Logs — logs de invocación, seguimiento y sus límites de muestreo/retención.
- Bot Fight Mode / Super Bot Fight Mode — los ajustes de bots que pueden bloquear a Googlebot.
- Permitir tráfico de bots verificados — el patrón de regla personalizada con
cf.client.bot.
Bing — no existe ninguna página sobre el edge ni sobre Workers; IndexNow es el complemento relevante para volver a rastrear al instante tras un despliegue.
Citas de la fuente
Declaraciones oficiales. Cada enlace de Google es un enlace directo que salta al pasaje citado.
Google — la frontera del cloaking
- “Cloaking refers to the practice of presenting different content to users and search engines with the intent to manipulate search rankings and mislead users.” (traducción) «El cloaking se refiere a la práctica de presentar contenido distinto a los usuarios y a los motores de búsqueda con la intención de manipular las posiciones de búsqueda y engañar a los usuarios». — Google Search Central, Políticas de spam para la búsqueda web de Google. Ir a la cita
- “Inserting text or keywords into a page only when the user agent that is requesting the page is a search engine, not a human visitor” (traducción) «Insertar texto o palabras clave en una página solo cuando el agente de usuario que la solicita es un motor de búsqueda, y no un visitante humano» — citado como ejemplo de cloaking. Ir a la cita
Google — caché HTTP (Crawling December, 2024)
- “Google’s crawling infrastructure supports heuristic HTTP caching as defined by the HTTP caching standard, specifically through the ETag response- and If-None-Match request header, and the Last-Modified response- and If-Modified-Since request header.” (traducción) «La infraestructura de rastreo de Google admite el almacenamiento en caché HTTP heurístico tal como lo define el estándar de caché HTTP, concretamente mediante la cabecera de respuesta ETag y la cabecera de solicitud If-None-Match, y la cabecera de respuesta Last-Modified y la cabecera de solicitud If-Modified-Since». Ir a la cita
- “We strongly recommend using ETag because it’s less prone to errors and mistakes (the value is not structured unlike the Last-Modified value).” (traducción) «Recomendamos encarecidamente usar ETag porque es menos propenso a errores y equivocaciones (su valor no está estructurado, a diferencia del valor de Last-Modified)». Ir a la cita
- “If the ETag value sent by the crawler matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body.” (traducción) «Si el valor de ETag enviado por el rastreador coincide con el valor actual generado por el servidor, el servidor debería devolver un código de estado HTTP 304 (Not modified) sin cuerpo HTTP». Ir a la cita
- “While not required, consider also setting the max-age field of the Cache-Control header to help crawlers determine when to recrawl the specific URL.” (traducción) «Aunque no es obligatorio, considera establecer también el campo max-age de la cabecera Cache-Control para ayudar a los rastreadores a determinar cuándo volver a rastrear la URL concreta». Ir a la cita
Google — renderizado dinámico (obsoleto)
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (traducción) «El renderizado dinámico era una solución provisional y no una solución a largo plazo para los problemas del contenido generado por JavaScript en los motores de búsqueda». Ir a la cita
Yo — sobre las redirecciones a nivel de edge
- “I typically prefer to have redirects on the edge (CDN-level) over having them on the server.” (traducción) «Normalmente prefiero tener las redirecciones en el edge (a nivel de CDN) antes que tenerlas en el servidor.» — de mi guía en Ahrefs, 11 tipos de redirecciones y su impacto en SEO. Reproducido de mi propio artículo publicado; la redacción es mía, pero confirme la formulación exacta en la página en vivo antes de tratarla como una cita literal.
Cloudflare / SALT.agency — por qué usar Workers para las redirecciones
- “we needed to implement simple redirects, which should be easy to create on the majority of platforms but wasn’t supported” (traducción) «necesitábamos implementar redirecciones simples, algo que debería ser fácil de crear en la mayoría de las plataformas pero que no estaba soportado» — Igor Krestov y Dan Taylor, Profundizando en el SEO técnico con Cloudflare Workers (blog de Cloudflare). Reproducido a partir de un resumen de la entrada del blog de Cloudflare, no confirmado como subcadena exacta: vuelva a verificarlo en la página en vivo antes de usarlo como cita literal.
¿Qué herramienta para cada trabajo?
“Necesito añadir redirecciones.”
- ¿Un conjunto pequeño y estático (unas pocas docenas, sin lógica)? → Bulk Redirects o Redirect Rules de Cloudflare. Sin Worker, sin código.
- ¿Miles, indexadas por URL? → Un Worker + KV con búsqueda por clave.
- ¿Redirecciones relacionales (por locale, por segmento, consultadas)? → Un Worker + D1.
- ¿Necesita redirigir y reescribir cabeceras en la misma pasada? → Un Worker (las Rules no pueden hacer ambas).
“Necesito inyectar o corregir una etiqueta (canónica, hreflang, título, JSON-LD).”
- → Un Worker con
HTMLRewriter. No hay ningún producto sin código de Cloudflare para reescribir el cuerpo de forma arbitraria; ese es el trabajo de Workers.
“El rastreo de Googlebot cayó después de añadir Cloudflare.”
- Sospeche primero del Bot Fight Mode / Super Bot Fight Mode, no de su Worker. Compruebe si está desafiando a Googlebot, y recuerde que una regla de allow del WAF no lo arreglará: se cambia el modo en sí.
- Después compruebe las reglas personalizadas del WAF y si se está sirviendo un
503o un intersticial a los bots. - Solo entonces audite el código del Worker y el alcance de la ruta.
“Mi etiqueta inyectada no aparece.”
- Compruebe
CF-Cache-Status. ¿HIT/EXPIRED? Está viendo una respuesta cacheada: purgue la capa correcta (Cache API de Workers frente a caché del edge) y vuelva a probar. - ¿
MISSy sigue mal? Entonces es su lógica de Worker o el alcance de la ruta. Confírmelo con la inspección de URL de GSC.
“¿Debería prerenderizar solo para bots en un Worker?”
- → No. Eso es renderizado dinámico, que Google ha marcado como obsoleto. Prefiera SSR o renderizado estático aplicado a todo el mundo.
Lista de comprobación de Cloudflare Workers SEO
Antes de publicar un Worker de reescritura
- La ruta está delimitada a los caminos que necesita en
wrangler.toml—no a/*por reflejo— y ha confirmado qué versión desplegada está realmente activa en esa ruta. - El Worker aplica una lógica idéntica a cada solicitante (sin ramificación de contenido bot frente a humano).
- Los handlers de
HTMLRewriterson idempotentes y están probados frente a una etiqueta ausente, una etiqueta existente duplicada o malformada, y una respuesta que no es HTML, no solo frente al camino feliz. - Para las redirecciones, ha elegido la herramienta correcta: Bulk Redirects/Rules (pequeñas y estáticas), KV (indexadas por URL a escala) o D1 (relacionales), y ha confirmado que ningún otro sistema de redirecciones es ya dueño de esa URL.
- Los límites actuales del plan (CPU, subsolicitudes, tamaño de script) se comprobaron directamente, no de memoria.
- El
Cache-Controldel HTML reescrito no es tan agresivo como para retrasar el nuevo rastreo de las páginas modificadas. - Los metadatos de versión (fecha de compatibilidad, bindings, rutas) están registrados para la release, con una vía de rollback probada y una condición de parada definida para el despliegue.
Cordura con la caché
- Sabe cuál de las tres capas (Cache API de Workers / caché del edge /
Cache-Controldel origen) está tocando. - Si el Worker es dueño de la respuesta, establece un
ETagcorrecto y puede cortocircuitar a un304. - La purga/invalidación de caché es un paso explícito del despliegue.
Acceso de los bots
- El Bot Fight Mode / Super Bot Fight Mode no está desafiando a Googlebot (comprobado directamente: una regla de allow del WAF no lo anula).
- La regla personalizada de bots verificados (
cf.client.bot) está en su sitio si filtra por el lado del WAF. - Los bots reciben un
503, no un intersticial de verificación, cuando necesita frenarlos.
Verificar tras el despliegue
- La inspección de URL de GSC → Probar URL publicada confirma que la etiqueta inyectada está en el HTML renderizado.
-
CF-Cache-Statuscomprobado (HIT/MISS/EXPIRED) para saber si está viendo una copia cacheada. - IndexNow disparado (Bing y otros) si acaba de publicarse una tabla de redirecciones o un cambio de etiquetas.
- Versionado mediante entornos de Wrangler, con una vía de rollback probada.
Los modelos mentales
1. Un handler, tres fases.
Todo Worker es un handler fetch, y todo lo que haga vive en una de tres fases, en este orden:
reescribir la solicitud → reescribir las cabeceras de la respuesta → reescribir el cuerpo de
la respuesta (HTMLRewriter). Sitúe lo que va a cambiar dentro de esa secuencia antes de escribir
una sola línea.
2. “Caché” son tres cosas, no una.
Cache API de Workers (caches.default) ≠ caché del edge de Cloudflare ≠ Cache-Control del origen.
Cuando un cambio “no aparece”, pregunte qué capa está mirando en realidad antes de tocar el código.
3. La prueba del cloaking: identidad frente a lógica. Ramificar según quién pregunta para cambiar el contenido = cloaking. Aplicar la misma lógica a todo el mundo —aunque esa lógica inspeccione el UA para registrarlo o por velocidad— está bien. Pregúntese: “¿un usuario real obtendría exactamente lo mismo que obtuvo Googlebot?”
4. El orden de sospechosos ante una caída del rastreo. Bot Fight Mode → reglas del WAF → código del Worker → alcance de la ruta. Los ajustes de bots se ejecutan en una cadena que sus reglas de allow no alcanzan, así que sospeche primero de ellos.
5. El Worker es dueño de la respuesta, así que es dueño de la semántica de caché.
Si su Worker genera o reescribe el cuerpo, es responsable de ETag, 304 y max-age. Eso es una
capacidad (cortocircuitar usted mismo a un 304) y una responsabilidad (cachear en exceso y retrasar el
nuevo rastreo).
Cloudflare Workers SEO — hoja de referencia
Elegir la herramienta de redirección
| Situación | Usar |
|---|---|
| Unas pocas docenas de redirecciones estáticas | Bulk Redirects / Redirect Rules (sin código) |
| Miles, indexadas por URL | Worker + KV |
| Relacionales / por locale, consultadas | Worker + D1 |
| Redirigir y reescribir cabeceras a la vez | Worker |
Las tres cachés
| Capa | Qué es | Se toca mediante |
|---|---|---|
| Cache API de Workers | Programable, de ámbito Worker | caches.default, caches.open() |
| Caché del edge de Cloudflare | La caché de la CDN | reglas de caché / purga |
Cache-Control del origen | Cabeceras de respuesta | su origen o su Worker |
API de handlers de HTMLRewriter
getAttribute/setAttribute— leer/establecer un atributo de etiqueta (p. ej., elhrefde la canónica)prepend/append— añadir marcado dentro de un elemento (p. ej., una etiqueta enhead)setInnerContent— reemplazar el contenido de un elementoreplace— sustituir el elemento por completo
Datos rápidos
- Límite de CPU: 10 ms gratuito / 30 ms de pago (las esperas de reloj de
fetchno cuentan). - Cloaking = diferencia de contenido según la identidad de quien solicita para manipular los rankings, no “el Worker leyó el UA”.
- El Bot Fight Mode se ejecuta fuera del WAF Ruleset Engine: las reglas de allow no lo alcanzan; cambie el modo.
- Verificar un cambio de Worker: Probar URL publicada en GSC + cabecera
CF-Cache-Status. - Google recomienda
ETag; si el ETag coincide → devuelva un 304 sin cuerpo.
Verificar qué recibió realmente Googlebot, tras un despliegue de Worker
Solicitar como Googlebot y comparar (shell)
# Fetch as a normal browser
curl -sS -A "Mozilla/5.0" https://example.com/page/ -o user.html -D user.headers
# Fetch as Googlebot's UA
curl -sS -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o bot.html -D bot.headers
# The bodies should be identical — a diff is a cloaking red flag
diff user.html bot.html && echo "identical (good)"
# Check what cache layer served it
grep -i "cf-cache-status" bot.headers # HIT / MISS / EXPIREDConfirmar que es Googlebot real (las cadenas de UA se falsifican con total facilidad): DNS inverso y directo
# 1) Reverse DNS the IP from your logs — must end in googlebot.com / google.com
host 66.249.66.1
# 2) Forward DNS that hostname back — must resolve to the same IP
host crawl-66-249-66-1.googlebot.comSi falla cualquiera de las dos comprobaciones, no es Googlebot. También puede contrastarlo con los rangos publicados por Google en googlebot.json.
Leer las etiquetas inyectadas a partir del HTML renderizado (consola de DevTools)
// Paste into the browser console on the live page to confirm your Worker's injection
[...document.querySelectorAll('link[rel="canonical"]')].map(l => l.href);
[...document.querySelectorAll('link[rel="alternate"][hreflang]')]
.map(l => `${l.hreflang} -> ${l.href}`);
[...document.querySelectorAll('script[type="application/ld+json"]')].map(s => s.textContent);Un cortocircuito mínimo de ETag / 304 dentro de un Worker
export default {
async fetch(request, env, ctx) {
const res = await fetch(request);
const body = await res.text();
const etag = `"${await sha1(body)}"`; // your hash of choice
if (request.headers.get("If-None-Match") === etag) {
return new Response(null, { status: 304 }); // no body, per Google's guidance
}
const headers = new Headers(res.headers);
headers.set("ETag", etag);
return new Response(body, { ...res, headers });
},
}; Herramientas para construir y verificar el SEO en Workers
- Wrangler — la CLI de Cloudflare para desarrollar, versionar y desplegar Workers (delimitación de rutas, entornos, rollback, secretos). Aquí es donde vive la higiene de despliegue.
- HTMLRewriter — el analizador de HTML en streaming integrado; la API para toda reescritura del cuerpo.
- Workers KV / D1 — el almacenamiento para las tablas de redirecciones y la configuración (KV para búsquedas por clave, D1 para SQL).
- Inspección de URL de GSC → Probar URL publicada — obtiene y renderiza la página como Google para que pueda confirmar que una canónica/hreflang/JSON-LD inyectados han aterrizado de verdad.
- Cabecera
CF-Cache-Status(mediantecurl -Io la pestaña Network de DevTools) — le diceHIT/MISS/EXPIREDpara que sepa si está viendo una copia cacheada o una respuesta fresca del Worker. - IndexNow — avise a Bing y a otros motores participantes en el instante en que se publique un cambio impulsado por un Worker.
- Análisis de logs del servidor — la verdad de campo sobre si el Googlebot real (verificado) está llegando siquiera a las rutas de su Worker.
Auditar un Worker en cuanto a coherencia SEO y comportamiento de caché
Review this Cloudflare Worker fetch handler as an SEO edge change. Trace the request,
response-header, body-rewrite, redirect, and caching paths. Return:
1. Every branch based on user agent, bot status, cookie, geography, or request header
2. Whether Googlebot/no-cookie traffic can receive different indexable content or SEO tags
3. HTMLRewriter selectors that fail when a tag is missing or create duplicates
4. Redirect lookups that can chain, loop, or fall through unexpectedly
5. Each use of the Cache API, Cloudflare edge cache behavior, and origin Cache-Control—kept as separate layers
6. Cache keys that could mix variants or preserve a stale canonical/robots/header change
7. A minimal test matrix for users, verified bots, cache hit/miss, and representative URLs
Apply the same content and SEO logic to bots and users. Flag intentional personalization
for human review rather than calling it cloaking automatically. Do not invent Cloudflare
settings, bindings, routes, cache rules, or origin behavior that are not in my input.
Worker code, bindings, routes, and relevant cache/security configuration:
[PASTE INPUT]Revisar un cambio de HTMLRewriter antes del despliegue
Audit this HTMLRewriter implementation for one SEO task: [CANONICAL / HREFLANG / JSON-LD].
Check whether it handles existing, missing, and duplicate elements; produces valid absolute
URLs or JSON; applies to the intended route cohort; and behaves identically for every
requester. Then return corrected code plus raw-response and rendered-response tests.
Do not add product, organization, locale, URL, or schema facts that are not supplied.
Code and expected per-route output:
[PASTE INPUT] Compruebe sus conocimientos: Cloudflare Workers SEO
Cinco preguntas rápidas sobre cómo hacer SEO técnico con Cloudflare Workers. Elija una respuesta para cada una y después compruebe.
Recursos que merecen su tiempo
Mis textos relacionados
- 11 tipos de redirecciones y su impacto en SEO (Ahrefs) — las opciones de redirección en Cloudflare, y por qué prefiero las redirecciones a nivel de edge frente a las de nivel de servidor.
- La guía para principiantes de SEO técnico (Ahrefs) — dónde encajan los cambios en el edge dentro del panorama general.
- Problemas de SEO de JavaScript y buenas prácticas (Ahrefs) — el lado del renderizado, relevante para cualquier tentación de prerenderizar en el edge.
Mis intervenciones
- Ajusta tu SEO técnico, la velocidad de la página y la seguridad (entrevista en Marketing Speak) — donde repaso el uso de Cloudflare Workers para reescribir antes de que el usuario llegue a ver la página, y la descarga de las redirecciones a la CDN. Transcripción de una entrevista hablada; trate las formulaciones concretas como paráfrasis y no como citas literales.
Del sector
- Profundizando en el SEO técnico con Cloudflare Workers — Igor Krestov (SALT.agency) y Dan Taylor en el blog de Cloudflare; el origen del patrón de cadena de filtros (solicitud/respuesta/cuerpo).
- ¿Qué es el SEO en el edge? (Search Engine Land) — el concepto que cubre el hub padre de este artículo, en versión de terceros.
- SEO en el edge (Dan Taylor) — de la persona que acuñó el término a partir de su investigación sobre Cloudflare Workers.
- HTMLRewriter (documentación de Cloudflare) — la referencia canónica de la API de reescritura del cuerpo.
- Cómo funciona la caché (documentación de Cloudflare) — desenreda la Cache API de la caché del edge.
- Redirecciones para el entrenamiento de IA (blog de Cloudflare) — canonicalización aplicada en el edge como función de producto, un contraste útil frente a programarla a mano en un Worker.
Profundizar / desviarse
- Edge SEO — el hub padre: concepto general, comparación de plataformas, Snippets frente a Workers, la regla del cloaking al completo.
Registro de cambios
Actualizado el 8 ago 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.
Actualizado el 18 jul 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.