SEO para Cloudflare Workers
Como fazer mudanças técnicas de SEO no Cloudflare Workers — o handler fetch, o HTMLRewriter para injetar canonical/hreflang/JSON-LD, redirecionamentos apoiados por KV, a Cache API versus o cache de borda versus Cache-Control, a fronteira do cloaking e como o Bot Fight Mode pode bloquear o Googlebot.
Idiomas
1 sinal de evidência nesta página
- Dados de origem vinculadosgooglebot.json
SEO para Cloudflare Workers é fazer SEO técnico no runtime serverless da Cloudflare: um Worker só vê as solicitações correspondentes à sua rota, e cada uma entra em um único handler fetch onde você reescreve a solicitação, os headers da resposta e o corpo da resposta. A reescrita do corpo passa pelo HTMLRewriter — o mecanismo real para injetar uma canonical, corrigir hreflang ou adicionar JSON-LD sem uma implantação do CMS — e precisa ser idempotente para casos ausentes, duplicados e não HTML. Redirecionamentos em escala pertencem ao KV ou D1; Bulk Redirects/Rules são mais simples para conjuntos pequenos, mas escolha um responsável por URL para que os sistemas não entrem em conflito. Três coisas diferentes compartilham a palavra cache — a Workers Cache API, o cache de borda da Cloudflare e o Cache-Control da origem — e confundi-las é o motivo de uma tag injetada parecer não aparecer; diagnostique por chave de cache, camada, TTL e invalidação. A regra absoluta é o cloaking: aplique lógica idêntica ao Googlebot e aos usuários. O problema mais específico dos Workers causado pelo próprio operador é o Bot Fight Mode bloquear o Googlebot em um pipeline ao qual as regras de permissão do WAF nem chegam. Publique toda mudança que afete SEO com metadados de versão registrados e um rollback testado, depois verifique com a inspeção de URL do GSC e o header CF-Cache-Status. Consulte o hub de Edge SEO para o conceito geral.
TL;DR — Cloudflare Workers são pequenos programas executados na rede da Cloudflare, na frente do seu site real. Um Worker pode adicionar um redirecionamento, corrigir uma meta tag ou injetar uma tag canonical enquanto a página passa — sem tocar no CMS nem esperar pelos desenvolvedores. Esta página é a versão prática e focada em código da ideia mais ampla de Edge SEO: como fazer isso especificamente em Workers. A única regra que você não pode quebrar: qualquer alteração de um Worker precisa valer da mesma forma para o Google e para os visitantes reais. Mostrar algo diferente ao Google é cloaking.
O que é um Cloudflare Worker, em termos simples
Se seu site está na Cloudflare, toda solicitação de um visitante (ou do Googlebot) passa pela rede da Cloudflare antes de chegar ao seu servidor real. Um Worker é um pequeno script que você pode executar nesse ponto do caminho. Ele vê a solicitação chegando e a resposta saindo, e pode alterar qualquer uma delas. 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
Esse é o grande atrativo para SEO: você consegue corrigir coisas em páginas que não poderia editar de outra maneira. Preso a uma plataforma bloqueada? Esperando semanas para um desenvolvedor adicionar uma tag canonical? Um Worker pode fazer isso em minutos, ao vivo, sem uma implantação no próprio site.
Para que as pessoas usam Workers em SEO
- Redirecionamentos — envie URLs antigas para novas na borda, mesmo aos milhares.
- Corrigir ou adicionar tags — injete uma tag canonical, corrija um título, adicione hreflang ou inclua dados estruturados, tudo sem editar o código-fonte da página.
- Reescrever headers — adicione ou corrija itens como
X-Robots-Tag.
A regra que você não pode quebrar
Tudo o que seu Worker fizer precisa ser feito para todos. Se você mostrar ao Googlebot uma página diferente da que uma pessoa real vê — para manipular rankings — isso é cloaking e viola as regras do 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 O padrão seguro é simples: aplique a mesma lógica a cada solicitação, independentemente de quem está solicitando. (O hub de Edge SEO aborda essa regra em profundidade — esta página presume que você já entende o conceito e quer saber como fazê-lo especificamente na Cloudflare.)
As duas formas de causar problemas a si mesmo
A maioria das histórias de “a Cloudflare prejudicou meu SEO” não tem relação com o código do Worker:
- Uma configuração de bloqueio de bots. O Bot Fight Mode da Cloudflare pode bloquear ou desafiar o Googlebot por acidente. Se o Google não consegue buscar suas páginas, nada mais importa.
- Confusão de cache. A Cloudflare tem mais de um tipo de cache e, se você não souber qual está acessando, uma mudança publicada pode parecer que “não apareceu”.
Quer ver o código real — um handler fetch, um exemplo de HTMLRewriter, uma tabela de redirecionamentos em KV — além dos detalhes de cache e bloqueio de bots? Mude para a aba Avançado.
TL;DR — Um Cloudflare Worker só vê solicitações correspondentes à sua rota configurada e intercepta cada uma em um único handler
fetch, onde você faz três coisas em sequência: reescreve a solicitação, reescreve os headers da resposta e reescreve o corpo da resposta por meio deHTMLRewriter. Esse é o mecanismo real por trás de “injetar uma canonical” ou “corrigir um título” — e ele precisa ser idempotente, testado contra respostas ausentes, duplicadas e não HTML, não apenas contra o caminho feliz. Redirecionamentos em escala ficam em KV (consulta rápida por chave) ou D1 (relacional); Bulk Redirects/Rules cobrem conjuntos pequenos de forma mais simples, e em geral prefiro redirecionamentos no nível da borda aos do servidor — mas escolha um único responsável por cada URL, porque um redirecionamento do Worker, um Bulk Redirect e um redirecionamento da origem podem ser acionados no mesmo caminho. Três coisas diferentes compartilham a palavra “cache” — a Workers Cache API (caches.default), o cache de borda da Cloudflare e oCache-Controlda origem — e confundi-las é a causa habitual de “minha tag não apareceu”; diagnostique a obsolescência pela chave, camada, TTL e invalidação do cache, em vez de adivinhar. A orientação do próprio Google sobre ETag / If-None-Match / 304 é diretamente acionável para um Worker que controla a resposta. A linha do cloaking: lógica idêntica para cada solicitante. A ferida mais específica dos Workers é o Bot Fight Mode, que roda fora do WAF Ruleset Engine, então regras comuns de “allow” nem chegam a ele. Publique toda mudança que afete SEO com metadados de versão registrados, rollback testado e uma condição de parada — depois verifique com a inspeção de URL do GSC eCF-Cache-Status.
O que este artigo é (e não é)
Este é o complemento prático e focado em código do hub de Edge SEO. O hub é responsável pela definição geral, pela tabela de comparação de plataformas (Workers, Akamai, Fastly, Lambda@Edge, Vercel, Netlify), pela decisão Snippets versus Workers e pelo tratamento completo da regra de cloaking. Não vou reproduzir nada disso aqui. Esta página aprofunda um nível nos Cloudflare Workers — o runtime usado pelo próprio Worker deste site, conectado por meio de run_worker_first em wrangler.toml — com APIs reais, não com generalidades de que “edge compute pode injetar tags”.
Uma observação antes do código: o Google não tem documentação específica de SEO para Cloudflare Workers. A orientação oficial que governa isso (política de cloaking, cache HTTP e rastreamento de CDNs) é geral e se aplica a qualquer implementação de borda. Prefiro dizer isso claramente a insinuar que existe um documento do Google que não existe.
Como um Worker se posiciona no caminho de solicitação/resposta
Um Worker é um script serverless executado em isolados V8. Toda solicitação encaminhada a ele entra por um 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 “Encaminhada” faz um trabalho real nessa frase: um Worker só vê solicitações que correspondem à sua rota ou domínio personalizado configurado — todo o resto nunca chega ao handler fetch. Quando duas rotas podem corresponder à mesma URL, o padrão mais específico tem precedência; portanto, antes de confiar no comportamento de um Worker para uma URL, confirme que a rota realmente corresponde a ela e verifique qual versão implantada está ativa nessa rota (ambientes do Wrangler e lançamentos graduais significam que a versão que recebe tráfego nem sempre é a que está no seu editor). Dentro do handler, você pode fazer três coisas distintas, nesta ordem:
- Reescrever a solicitação antes que ela vá para sua origem.
- Reescrever os headers da resposta no caminho de volta.
- Reescrever o corpo da resposta — por meio de
HTMLRewriter.
Esta é a 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 });
},
};A equipe da SALT.agency, que cunhou “edge SEO” a partir de pesquisas sobre Cloudflare Workers, construiu suas ferramentas como uma cadeia de filtros — um filtro de solicitação, um filtro de resposta e um filtro de corpo. É o mesmo padrão de três fases; eles apenas deram nomes a ele. Manter essas três fases separadas na sua cabeça torna um Worker legível.
Reescrevendo HTML com HTMLRewriter
HTMLRewriter é o parser de HTML em fluxo da Cloudflare e é a API real por trás de todo truque de “injetar uma tag”. 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 Você registra handlers de elementos .on(selector, handler), e o handler recebe getAttribute / setAttribute, prepend / append, setInnerContent e replace. Como ele trabalha em fluxo, você não armazena o documento inteiro na memória.
Injetando ou corrigindo uma tag canonical
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);Se a página não tiver nenhuma canonical, anexe um handler a head e acrescente uma em vez de editar uma tag existente. De qualquer maneira, lembre-se da lição da parte de canonicalização: rel=canonical é uma dica, não um comando — um Worker permite defini-la de maneira consistente em toda uma plataforma, mas o Google ainda decide.
O CanonicalHandler acima presume que uma tag já existe e que a resposta é HTML. Nenhuma das duas coisas é garantida em produção, e errar é a forma de acabar com duas tags canonicals em uma página em vez de uma. Antes de publicar uma reescrita como esta, torne-a idempotente e teste-a contra:
- Nenhuma canonical existente — seu handler precisa detectar a ausência e usar
appendpara adicionar uma ahead, não fazer nada silenciosamente porquelink[rel="canonical"]não encontrou correspondência. - Uma canonical duplicada ou malformada já presente — decida se remove a tag excedente ou deixa a reescrita adicionar uma segunda (a última opção é um bug real, não um caso de borda — canonicals duplicadas são um problema comum criado pelo próprio site).
- Uma resposta não HTML — uma rota de API, uma imagem ou uma resposta de redirecionamento passada pelo mesmo Worker não deve passar pelo
HTMLRewriter; limite a transformação às rotas e aos tipos de conteúdo que você realmente verificou. - Executar a transformação duas vezes na mesma resposta (um retry ou
fetchaninhado) — confirme que ela não acrescenta uma segunda tag.
Adicionando ou corrigindo alternates hreflang
O mesmo mecanismo, orientado por configuração. Você acrescenta um link[rel="alternate"] por localidade em head. Se seus alternates forem por localidade e relacionais, essa configuração pertence ao D1; se for uma consulta simples, KV basta. O ponto é que o HTMLRewriter os injeta da mesma maneira para cada solicitante — você não cria ramificações com base no user agent.
Injetando dados estruturados JSON-LD
new HTMLRewriter().on("head", {
element(head) {
head.append(
`<script type="application/ld+json">${JSON.stringify(schema)}</script>`,
{ html: true }
);
},
});Limites de CPU que pesam em escala
Uma afirmação de concorrente à qual eu faria objeção é “submilissegundo, sem restrições”. O teto real é o tempo de CPU: 10 ms no plano gratuito, 30 ms no pago (o tempo de parede esperando um fetch não conta — o tempo de CPU conta). Para reescritas típicas, você nunca perceberá. Para passagens pesadas de HTMLRewriter sobre páginas muito grandes, é uma restrição real a considerar no projeto, não alarmismo.
Redirecionamentos na borda: KV versus D1 versus Rules
Normalmente prefiro manter redirecionamentos na borda (no nível da CDN) em vez de no servidor — isso descarrega o trabalho da origem e é aplicado antes mesmo de a página ser gerada. Especificamente na Cloudflare, no meu guia da Ahrefs sobre redirecionamentos para SEO, expliquei que você tem várias opções: redirecionamentos individuais ou em massa, regras de redirecionamento, page rules ou Workers com pares chave-valor — ou um Worker que modifica headers para adicionar um redirecionamento.
Para uma tabela orientada por Worker, KV é o lugar natural: uma consulta rápida e eventualmente consistente por chave de 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);
},
};Use D1 quando os redirecionamentos forem relacionais (por localidade, por segmento e consultados via SQL). E reconheça quando um Worker é exagero: para um conjunto pequeno e estático de redirecionamentos, os Bulk Redirects ou Redirect Rules da Cloudflare são mais simples e não exigem código. Não crie manualmente um Worker em KV para cinquenta redirecionamentos.
Escolha um responsável por uma determinada URL e não deixe um redirecionamento do Worker, um Bulk Redirect, uma Redirect Rule e um redirecionamento da origem serem aplicados ao mesmo caminho — são sistemas separados que podem ser acionados na mesma solicitação e, quando mais de um corresponde, você depura precedência em vez de um redirecionamento limpo. Antes de adicionar um redirecionamento em qualquer lugar, verifique se já existe um para aquele caminho nos outros sistemas e escolha a camada com base na complexidade da correspondência (1:1 simples versus baseada em padrões), na escala e em quem precisa observá-lo ou revertê-lo — o redirecionamento de um Worker vive no seu código e nos seus logs; um Bulk Redirect ou Rule vive no dashboard e é mais fácil de auditar ou reverter para quem não é desenvolvedor.
Cache: três coisas diferentes, um nome confuso
Esta é a seção que as páginas concorrentes ignoram e que gera a maior parte da confusão de “por que minha mudança não apareceu”. Três camadas separadas compartilham a palavra cache:
- Workers Cache API —
caches.defaultecaches.open(). Este é um cache programável no escopo do Worker, que você lê e grava no código. - Cache de borda da Cloudflare — o cache da CDN que serve seus ativos. É distinto da Cache API.
Cache-Controlda origem — os headers definidos pela origem (ou pelo Worker), que influenciam ambos os itens acima e o que o Googlebot faz.
Confunda-os e você jurará que uma mudança não foi implantada, quando na verdade ela está sendo servida por uma camada que você não limpou.
Quando uma mudança realmente não aparece, não adivinhe — diagnostique camada por camada:
- Chave de cache. Quais atributos da solicitação determinam se duas solicitações atingem a mesma entrada em cache (URL e, às vezes, headers ou cookies se a chave os incluir)? Uma reescrita que varia por algo fora da chave de cache pode servir a variante errada.
- Qual camada serviu a resposta. Verifique
CF-Cache-Status(HIT/MISS/EXPIRED/DYNAMIC) para saber se o cache de borda respondeu ou se a solicitação chegou ao Worker. - Localização/estado. O cache da Cloudflare é distribuído por datacenters — uma limpeza ou uma implantação nova não necessariamente invalida instantaneamente todos os locais de borda.
- TTL e a regra que o definiu. Confirme se uma regra de cache, um header
Cache-Controlda origem ou um header definido pelo próprio Worker controla o TTL. - Invalidação. Você limpou a URL específica, limpou tudo ou esperou a expiração do TTL? Uma entrada da Cache API controlada pelo Worker (
caches.default) precisa de seu própriodelete()explícito — limpar o cache da CDN não a altera.
O que o Googlebot faz com ETag / If-None-Match / 304
Se o seu Worker gera ou reescreve a resposta, ele controla os headers de cache — o que significa que a orientação de cache HTTP do Google de dezembro de 2024 é diretamente acionável para você. O Google aceita cache HTTP heurístico por meio de ETag/If-None-Match e Last-Modified/If-Modified-Since, recomenda fortemente ETag porque ele é menos propenso a erros e diz que, quando o ETag do rastreador coincide, seu servidor deve retornar um status 304 Not Modified sem corpo. Um Worker que gera a resposta pode implementar exatamente isso: calcular um ETag, compará-lo com If-None-Match e retornar imediatamente um 304 — economizando computação e fornecendo ao Googlebot um sinal rápido e armazenável em cache.
A troca de recrawl do max-age
O Google também recomenda considerar a configuração de Cache-Control: max-age para ajudar rastreadores a decidir quando rastrear novamente. A ressalva para um Worker que reescreve HTML: um max-age agressivo em uma página cujas tags injetadas pelo Worker acabaram de mudar pode atrasar o Googlebot de ver a atualização recém-publicada. Não coloque uma vida útil longa de cache em HTML reescrito e esqueça dele.
A fronteira do cloaking, aplicada aos Workers
A regra rígida, nos termos de Workers, é: execute a mesma lógica para todos os solicitantes. A política de spam do Google define cloaking como apresentar conteúdo diferente a usuários e mecanismos de busca para manipular rankings e destaca especificamente inserir texto ou palavras-chave apenas quando o solicitante é um mecanismo de busca.
Alguns esclarecimentos, porque as pessoas exageram na correção:
- Inspecionar o User-Agent não é automaticamente cloaking. Registrar tráfego de bots ou servir uma resposta em cache mais rapidamente a qualquer cliente é aceitável. A linha é uma diferença de conteúdo por identidade do solicitante, feita para manipular rankings.
- Testes A/B divididos por página em Workers são aceitáveis. Dividir usuários por URL e tratar todos os solicitantes da mesma forma é legítimo. Dividir por quem está solicitando — bot versus humano — não é.
Um exemplo prático do padrão seguro: o próprio gate de preview deste site é um Worker que retorna 404 para qualquer caminho /preview/, a menos que um cookie corresponda a um segredo. Ele retorna esse 404 para todos sem o cookie — incluindo o Googlebot. Essa é exatamente a forma segura: não esconde uma coisa dos bots e mostra outra aos usuários; aplica uma regra uniformemente.
E não dependa de uma etapa de pré-renderização exclusiva para bots, mesmo que você a construa corretamente em Workers. O Google chamou a renderização dinâmica de solução alternativa, e não solução de longo prazo; um Worker que pré-renderiza apenas para bots herda essa descontinuação.
Como um Worker pode bloquear ou deixar o Googlebot mais lento acidentalmente
Esta é a forma mais específica dos Workers de dar um tiro no próprio pé, e normalmente não está no código do Worker.
O Bot Fight Mode roda fora do Ruleset Engine
O Bot Fight Mode (e o Super Bot Fight Mode) pode gerar falsos positivos contra rastreadores legítimos, incluindo o Googlebot. A armadilha: o Bot Fight Mode é avaliado em um pipeline separado do WAF Ruleset Engine, então suas regras personalizadas comuns de “allow” ou “skip” não o substituem. Se o Bot Fight Mode estiver desafiando o Googlebot, você não corrige isso com uma regra de permissão — precisa alterar ou desativar o próprio modo. (Confirme a mecânica atual na documentação de Bot Fight Mode e Super Bot Fight Mode da Cloudflare antes de depender dela — os produtos de bots mudam.)
O padrão de regra personalizada para bots verificados
A Cloudflare expõe um campo cf.client.bot e um padrão de permissão para bots verificados para permitir rastreadores conhecidos e confiáveis nas regras personalizadas — útil para o lado do WAF, embora (como acima) não alcance o Bot Fight Mode.
A própria CDN é neutra ou positiva
Para deixar o mito claro: a Cloudflare como CDN não prejudica o SEO. O próprio trabalho de 2024 do Google, Crawling December, observa que o Google aumenta a taxa de rastreamento quando detecta uma CDN — mas que uma CDN também pode bloquear acidentalmente o Googlebot por meio de regras de WAF/bots e que um 503 é melhor que um intersticial de verificação de bot. O risco é um Worker ou configuração de bot mal configurado, não a infraestrutura.
Verificando o que o Googlebot realmente recebeu
Depois de qualquer implantação de Worker, confirme o que um rastreador realmente recebeu — não presuma:
- GSC URL Inspection → Test Live URL. Busca a página como o Google e mostra o HTML renderizado, para que você confirme se a canonical/hreflang/JSON-LD injetada está realmente presente.
- Verifique
CF-Cache-Statusjunto com o HTML.HIT/MISS/EXPIREDinforma se você está vendo uma resposta nova do Worker ou uma resposta em cache — a forma mais rápida de descobrir que “a mudança não apareceu” por causa da camada de cache. - Busque diretamente como Googlebot. Faça a solicitação com o user agent do Googlebot e compare — mas lembre-se de que corresponder à string não prova nada sobre a identidade; verifique o Googlebot real com DNS reverso + direto contra os intervalos publicados pelo Google (veja a aba Scripts).
Higiene de implantação específica dos Workers
Uma implantação bem-sucedida do wrangler deploy informa que o script foi enviado — não que o Googlebot está recebendo a saída renderizada correta. Trate cada mudança de Worker que afete SEO como uma versão com registro, não apenas como um push:
- Defina o escopo das rotas. Não execute um Worker em
/*por padrão. Combine-o com os caminhos necessários nos padrões de rota dowrangler.tomlpara que um bug não derrube o site inteiro. - Verifique os limites atuais antes de prometer escala. Limites de CPU, quantidade de subrequests e tamanho do script variam por plano e mudam com o tempo — confirme na página atual de limites da Cloudflare antes de projetar uma reescrita em torno de um teto específico, em vez de confiar em um número lembrado.
- Registre metadados de versão para a publicação. O modelo de versões e implantações da Cloudflare acompanha versão do código-fonte, data de compatibilidade, bindings e rotas para cada implantação — anote qual versão está ativa em qual rota para que uma afirmação de que “o Worker faz X” possa ser verificada contra o que está realmente implantado, não contra o editor.
- Faça versionamento e rollback com ambientes do Wrangler. Publique em um ambiente de staging, faça lançamento gradual por porcentagem e mantenha a capacidade de reverter instantaneamente para a versão anterior.
- Use logs com escopo para monitorar o lançamento — considerando seus limites. Os Workers Logs e o tail de logs da Cloudflare podem ajudar a depurar um lançamento gradual, mas os logs são amostrados e mantidos por uma janela limitada — trate-os como evidência com escopo para as solicitações capturadas, não como registro completo de cada visita de rastreador.
- Defina uma condição de parada e teste o rollback antes de precisar dele. Decida antecipadamente qual comportamento observado (taxa de erro, resposta errada em uma verificação pontual, queda da taxa de rastreamento) interrompe o lançamento e confirme que o caminho de rollback realmente funciona, em vez de presumir que funcionará.
- Limpe o cache como parte da implantação. Como existem três camadas de cache, faça da limpeza/invalidação uma etapa explícita da publicação de uma reescrita, não uma reflexão tardia.
Uma observação sobre o Bing e uma questão para o futuro
O Bing também não tem orientação específica para Cloudflare/borda. Mas, como uma implantação de Worker é instantânea e os rastreamentos não são, o IndexNow é o complemento natural — dispare-o no momento em que uma tabela de redirecionamentos ou mudança de tag orientada por Worker for publicada para que o Bing (e outros mecanismos participantes) rastreiem novamente prontamente. E vale observar: a Cloudflare lançou a canonicalização imposta na borda como recurso de produto (“Redirects for AI Training”) — rastreadores de treinamento de IA verificados recebem um 301 para sua URL canonical com uma única opção. É um contraste útil com criar manualmente a lógica canonical no seu Worker e um lembrete de que “servir algo diferente a rastreadores e usuários” é um padrão sobre o qual a Microsoft demonstrou ceticismo publicamente nos demais recursos de rastreadores de IA da Cloudflare — uma boa verificação intuitiva para qualquer Worker condicional por bot.
Para o panorama mais amplo — comparação de plataformas, Snippets versus Workers e os ângulos de fila de desenvolvimento e governança — volte ao hub de Edge SEO.
Resumo de IA
Uma síntese da versão Avançada:
- Cloudflare Workers SEO = fazer SEO técnico no runtime de isolados V8 da Cloudflare. É a implementação no nível do código, específica para Workers, do conceito geral de Edge SEO — veja o hub para a definição, a comparação de plataformas e o aprofundamento em cloaking.
- Um Worker só vê o que sua rota corresponde. A configuração e a precedência de rotas/domínios decidem quais solicitações chegam ao handler
fetch— confirme a rota e a versão implantada antes de confiar no comportamento para uma URL. - Um handler
fetch, três fases: reescrever a solicitação, reescrever os headers da resposta e reescrever o corpo da resposta. A reescrita do corpo passa peloHTMLRewriter— o mecanismo real para injetar uma canonical, corrigir hreflang ou adicionar JSON-LD. Torne a reescrita idempotente e teste-a contra respostas ausentes, duplicadas, malformadas e não HTML, não apenas contra o caminho feliz. - Redirecionamentos: KV para consultas rápidas por chave, D1 para configuração relacional e Bulk Redirects/Rules para conjuntos estáticos pequenos. Patrick prefere redirecionamentos no nível da borda ao nível do servidor — mas escolha um único responsável por URL; um redirecionamento do Worker, Bulk Redirect, Redirect Rule e redirecionamento da origem podem ser acionados no mesmo caminho.
- Três caches compartilham uma palavra: Workers Cache API (
caches.default), cache de borda da Cloudflare eCache-Controlda origem — confundi-los causa “minha mudança não apareceu”. Diagnostique por chave, camada, TTL e invalidação, em vez de adivinhar. - A orientação do Google sobre cache ETag/If-None-Match/304 (dezembro de 2024) é diretamente acionável: um Worker que controla a resposta pode retornar 304 imediatamente; mas um
max-ageagressivo pode atrasar o recrawl de uma página recém-alterada. - Regra de cloaking: lógica idêntica para cada solicitante. Inspecionar o UA não é automaticamente cloaking; uma diferença de conteúdo por identidade do solicitante para manipular rankings é.
- Maior risco autoinfligido: o Bot Fight Mode roda fora do WAF Ruleset Engine, então regras normais de permissão não chegam a ele — você precisa alterar o próprio modo.
- Publique deliberadamente: verifique os limites atuais do plano antes de prometer escala, registre metadados de versão (data de compatibilidade, bindings e rotas) por publicação, use logs com escopo (amostrados, não um registro completo) para observar um lançamento e defina uma condição de parada com rollback testado antes de precisar dele.
- Verifique com a inspeção de URL do GSC (Test Live URL) e o header
CF-Cache-Status; observe os limites de CPU (10 ms no gratuito / 30 ms no pago) em reescritas pesadas.
Documentação oficial
Não existe documentação de SEO específica para Cloudflare Workers do Google ou do Bing — a orientação que governa o assunto é geral. As fontes primárias mais úteis se dividem entre os mecanismos de busca (política/cache) e a Cloudflare (APIs do runtime).
Google (aplica-se a qualquer implementação de borda)
- Políticas de spam — cloaking — a fronteira rígida que toda lógica de Worker precisa respeitar.
- Crawling December: HTTP caching (2024) — ETag / If-None-Match / 304 / max-age, diretamente acionáveis para um Worker que controla a resposta.
- Crawling December: CDNs and crawling (2024) — como uma CDN afeta a taxa de rastreamento e como regras de bots podem bloquear o Googlebot.
- Renderização dinâmica (descontinuada) — por que um Worker que pré-renderiza apenas para bots herda um padrão descontinuado.
- Visão geral dos crawlers e fetchers do Google — user agents e intervalos de IP publicados para verificação.
Cloudflare (o runtime)
- HTMLRewriter — a API de parser HTML em fluxo.
- Cache API —
caches.default/caches.open(). - Como o cache funciona — a diferença entre a Cache API e o cache de borda.
- Rotas e domínios — correspondência e precedência de rotas e quais solicitações realmente invocam um Worker.
- Bulk Redirects — o sistema de redirecionamento sem código que um redirecionamento de Worker pode sobrepor ou conflitar.
- Limites dos Workers — limites atuais de CPU, subrequests e tamanho do script; sensíveis ao plano e à data, portanto verifique diretamente em vez de confiar em um número lembrado.
- Versões e implantações — implantações versionadas/graduais e rollback.
- Workers Logs — logs de invocação, tailing e limites de amostragem/retenção.
- Bot Fight Mode / Super Bot Fight Mode — as configurações de bots que podem bloquear o Googlebot.
- Permitir tráfego de bots verificados — o padrão de regra personalizada
cf.client.bot.
Bing — não existe uma página sobre borda/Workers; IndexNow é o complemento relevante para um novo rastreamento imediato após a implantação.
Citações da fonte
Declarações registradas. Cada link do Google é um link profundo que salta para a passagem citada.
Google — a fronteira do 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.” — Google Search Central, Spam policies for Google web search. Ir para a citação
- “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” — listado como exemplo de cloaking. Ir para a citação
Google — cache 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.” Ir para a citação
- “We strongly recommend using ETag because it’s less prone to errors and mistakes (the value is not structured unlike the Last-Modified value).” Ir para a citação
- “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.” Ir para a citação
- “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.” Ir para a citação
Google — renderização dinâmica (descontinuada)
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” Ir para a citação
Eu — sobre redirecionamentos no nível da borda
- “I typically prefer to have redirects on the edge (CDN-level) over having them on the server.” — do meu guia da Ahrefs, 11 Types of Redirects & Their SEO Impact. Reproduzido do meu próprio artigo publicado; confirme a redação exata na página atual antes de tratá-la como uma citação rígida.
Cloudflare / SALT.agency — por que usar Workers para redirecionamentos
- “we needed to implement simple redirects, which should be easy to create on the majority of platforms but wasn’t supported” — Igor Krestov e Dan Taylor, Diving into Technical SEO using Cloudflare Workers (blog da Cloudflare). Reproduzido por meio de um resumo da publicação do blog da Cloudflare, não confirmado como trecho exato — verifique novamente na fonte atual antes de usá-lo como citação em bloco.
Qual ferramenta usar em cada caso?
“Preciso adicionar redirecionamentos.”
- Um conjunto pequeno e estático (algumas dezenas, sem lógica)? → Bulk Redirects ou Redirect Rules da Cloudflare. Sem Worker, sem código.
- Milhares de redirecionamentos indexados por URL? → Uma consulta de Worker + KV.
- Redirecionamentos relacionais (por localidade, segmento, consultados)? → Um Worker + D1.
- Precisa redirecionar e reescrever headers na mesma passagem? → Um Worker (Rules não fazem as duas coisas).
“Preciso injetar ou corrigir uma tag (canonical, hreflang, title, JSON-LD).”
- → Um Worker com
HTMLRewriter. Não há um produto Cloudflare sem código para reescrita arbitrária do corpo; esse é o trabalho dos Workers.
“O rastreamento do Googlebot caiu depois que adicionei a Cloudflare.”
- Primeiro suspeite do Bot Fight Mode / Super Bot Fight Mode, não do seu Worker. Verifique se ele está desafiando o Googlebot — e lembre-se de que uma regra de permissão do WAF não vai corrigir isso; você precisa alterar o próprio modo.
- Depois verifique as regras personalizadas do WAF e se um
503/interstitial está sendo servido aos bots. - Só então audite o código do Worker e o escopo da rota.
“Minha tag injetada não está aparecendo.”
- Verifique
CF-Cache-Status.HIT/EXPIRED? Você está vendo uma resposta em cache — limpe a camada correta (Workers Cache API versus cache de borda) e teste novamente. MISSe ainda errado? Agora o problema está na lógica do Worker ou no escopo da rota. Confirme com a inspeção de URL do GSC.
“Devo pré-renderizar apenas para bots em um Worker?”
- → Não. Isso é renderização dinâmica, que o Google descontinuou. Prefira renderização SSR/estática aplicada a todos.
Checklist de SEO para Cloudflare Workers
Antes de publicar um Worker de reescrita
- A rota está limitada aos caminhos de que precisa em
wrangler.toml— não é/*por reflexo — e você confirmou qual versão implantada está realmente ativa nessa rota. - O Worker aplica lógica idêntica a todos os solicitantes (nenhuma ramificação de conteúdo entre bot e humano).
- Os handlers de
HTMLRewritersão idempotentes e foram testados contra uma tag ausente, uma tag existente duplicada/malformada e uma resposta não HTML — não apenas contra o caminho feliz. - Para redirecionamentos, você escolheu a ferramenta certa: Bulk Redirects/Rules (pequenos/estáticos), KV (indexados por URL em escala) ou D1 (relacionais) — e confirmou que nenhum outro sistema de redirecionamento já é responsável por essa URL.
- Os limites atuais do plano (CPU, subrequests, tamanho do script) foram verificados diretamente, não lembrados de memória.
- O
Cache-Controldo HTML reescrito não é tão agressivo que atrase o novo rastreamento de páginas alteradas. - Os metadados de versão (data de compatibilidade, bindings, rotas) estão registrados para o lançamento, com um caminho de rollback testado e uma condição de parada definida para a liberação.
Sanidade do cache
- Você sabe qual das três camadas (Workers Cache API / cache de borda /
Cache-Controlda origem) está tocando. - Se o Worker é responsável pela resposta, ele define um
ETagcorreto e pode retornar304imediatamente. - A limpeza/invalidação do cache é uma etapa explícita da implantação.
Acesso dos bots
- O Bot Fight Mode / Super Bot Fight Mode não está desafiando o Googlebot (verificado diretamente — uma regra de permissão do WAF não o substitui).
- Uma regra personalizada para bots verificados (
cf.client.bot) está configurada se você aplicar o controle no lado do WAF. - Os bots recebem um
503, não um interstitial de verificação, quando você precisa desacelerá-los.
Verifique depois da implantação
- A inspeção de URL do GSC → Test Live URL confirma que a tag injetada está no HTML renderizado.
-
CF-Cache-Statusverificado (HIT/MISS/EXPIRED), para você saber se está vendo uma cópia em cache. - O IndexNow foi acionado (Bing/outros) se uma tabela de redirecionamentos ou mudança de tag acabou de ser publicada.
- Versionado por meio dos ambientes do Wrangler, com um caminho de rollback testado.
Os modelos mentais
1. Um handler, três fases.
Todo Worker é um handler fetch, e tudo o que você faz vive em uma das três fases, nesta ordem:
reescrever a solicitação → reescrever os headers da resposta → reescrever o corpo da resposta
(HTMLRewriter). Localize o que está alterando nessa sequência antes de escrever uma linha.
2. “Cache” são três coisas, não uma.
Workers Cache API (caches.default) ≠ cache de borda da Cloudflare ≠ Cache-Control da origem. Quando uma alteração
“não aparece”, pergunte qual camada você está realmente observando antes de mexer no código.
3. O teste de cloaking: identidade versus lógica. Ramificar por quem está solicitando para alterar o conteúdo = cloaking. Aplicar a mesma lógica a todos — mesmo que essa lógica inspecione o UA para logging ou velocidade — é aceitável. Pergunte: “um usuário real receberia exatamente o que o Googlebot recebeu?”
4. A ordem de investigação para uma queda de rastreamento. Bot Fight Mode → regras do WAF → código do Worker → escopo da rota. As configurações de bots rodam em um pipeline que suas regras de permissão não alcançam, então suspeite delas primeiro.
5. O Worker é responsável pela resposta — portanto, é responsável pela semântica do cache.
Se o seu Worker gera ou reescreve o corpo, ele é responsável por ETag, 304 e max-age.
Isso é uma capacidade (retornar um 304 imediatamente por conta própria) e uma responsabilidade (armazenar em cache por tempo demais e atrasar o novo rastreamento).
SEO para Cloudflare Workers — folha de consulta
Escolha a ferramenta de redirecionamento
| Situação | Use |
|---|---|
| Algumas dezenas de redirecionamentos estáticos | Bulk Redirects / Redirect Rules (sem código) |
| Milhares, indexados por URL | Worker + KV |
| Relacionais / por localidade, consultados | Worker + D1 |
| Redirecionar e reescrever headers juntos | Worker |
Os três caches
| Camada | O que é | Você a acessa por meio de |
|---|---|---|
| Workers Cache API | Programável, no escopo do Worker | caches.default, caches.open() |
| Cache de borda da Cloudflare | O cache da CDN | regras de cache / purge |
Cache-Control da origem | Headers da resposta | sua origem ou seu Worker |
API de handlers do HTMLRewriter
getAttribute/setAttribute— ler/definir um atributo de tag (por exemplo,hrefde uma canonical)prepend/append— adicionar markup dentro de um elemento (por exemplo, uma tag emhead)setInnerContent— substituir o conteúdo de um elementoreplace— trocar o elemento inteiro
Fatos rápidos
- Limite de CPU: 10 ms no plano gratuito / 30 ms no pago (esperas de
fetchno relógio não contam). - Cloaking = diferença de conteúdo por identidade do solicitante para manipular rankings — não “o Worker leu o UA”.
- O Bot Fight Mode roda fora do Ruleset Engine do WAF — regras de permissão não o alcançam; altere o modo.
- Verifique uma mudança no Worker: GSC Test Live URL + header
CF-Cache-Status. - O Google recomenda
ETag; ETag correspondente → retorne 304 sem corpo.
Verifique o que o Googlebot realmente recebeu — depois de uma implantação do Worker
Busque como Googlebot e compare (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 / EXPIREDConfirme o Googlebot real (strings de UA são fáceis de falsificar) — DNS reverso + direto
# 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.comIf either check fails, it isn’t Googlebot. You can also match against Google’s published googlebot.json ranges.
Leia as tags injetadas no HTML renderizado (console do 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);Um curto-circuito mínimo de ETag / 304 dentro de um 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 });
},
}; Ferramentas para criar e verificar SEO em Workers
- Wrangler — CLI da Cloudflare para desenvolver, versionar e implantar Workers (escopo de rotas, ambientes, rollback, secrets). É aqui que vive a disciplina de implantação.
- HTMLRewriter — o parser de HTML em fluxo integrado; a API para toda reescrita do corpo.
- Workers KV / D1 — o armazenamento para tabelas de redirecionamento e configuração (KV para consultas por chave, D1 para SQL).
- Inspeção de URL do GSC → Test Live URL — busca e renderiza a página como o Google, para você confirmar que uma canonical/hreflang/JSON-LD injetada realmente chegou ao resultado.
- Header
CF-Cache-Status(viacurl -Iou Network do DevTools) — informaHIT/MISS/EXPIRED, para você saber se está vendo uma cópia em cache ou uma resposta nova do Worker. - IndexNow — avise o Bing e outros mecanismos participantes no instante em que uma mudança controlada por Worker for publicada.
- Análise de logs do servidor — a fonte de verdade para saber se o Googlebot real (verificado) está alcançando as rotas do seu Worker.
Audite um Worker quanto à consistência de SEO e ao comportamento do cache
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]Revise uma alteração do HTMLRewriter antes da implantação
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] Teste seus conhecimentos: SEO para Cloudflare Workers
Cinco perguntas rápidas sobre como fazer SEO técnico com Cloudflare Workers. Escolha uma resposta para cada uma e depois confira.
Recursos que valem seu tempo
Textos relacionados meus
- 11 Types of Redirects & Their SEO Impact (Ahrefs) — as opções de redirecionamento na Cloudflare e por que prefiro redirecionamentos no nível da borda aos do servidor.
- The Beginner’s Guide to Technical SEO (Ahrefs) — onde as mudanças na borda se encaixam no panorama mais amplo.
- JavaScript SEO Issues & Best Practices (Ahrefs) — o lado da renderização, relevante para qualquer tentação de pré-renderizar na borda.
Minhas palestras
- Fine-Tune your Technical SEO, Page Speed, and Security (entrevista Marketing Speak) — onde explico como usar Cloudflare Workers para reescrever antes de o usuário sequer ver a página e transferir os redirecionamentos para a CDN. Transcrição de entrevista falada; trate formulações específicas como paráfrase, não como citações exatas.
Do setor
- Diving into Technical SEO using Cloudflare Workers — Igor Krestov (SALT.agency) e Dan Taylor no blog da Cloudflare; a origem do padrão de cadeia de filtros (solicitação/resposta/corpo).
- What is edge SEO? (Search Engine Land) — o conceito abordado pelo hub pai deste artigo, em uma fonte de terceiros.
- Edge SEO (Dan Taylor) — da pessoa que cunhou o termo a partir de pesquisas sobre Workers fora da Cloudflare.
- HTMLRewriter (documentação da Cloudflare) — a referência canônica da API de reescrita do corpo.
- How the cache works (documentação da Cloudflare) — separa a Cache API do cache de borda.
- Redirects for AI Training (blog da Cloudflare) — canonicalização aplicada na borda como recurso de produto, um contraste útil com implementá-la manualmente em um Worker.
Aprofunde-se / vá para o lado
- Edge SEO — o hub pai: conceito geral, comparação de plataformas, Snippets versus Workers e a regra de cloaking completa.
Registro de alterações
Atualizado em 18 de jul. de 2026.
Resumo editorial e detalhes registrados da alteração.Detalhes da alteração
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
Não é possível fazer a comparação completa — nenhum instantâneo anterior foi arquivado para esta revisão.