SEO para Cloudflare Workers
Como fazer mudanças técnicas de SEO no Cloudflare Workers — o handler fetch, HTMLRewriter para injetar canonical/hreflang/JSON-LD, redirecionamentos com KV, Cache API versus cache de borda versus Cache-Control, a fronteira do cloaking e como o Bot Fight Mode pode bloquear o Googlebot.
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 que correspondem à sua rota, e cada uma entra em um único handler fetch, onde você reescreve a solicitação, os cabeçalhos da resposta e o corpo. A reescrita do corpo usa HTMLRewriter — o mecanismo real para injetar canonical, corrigir hreflang ou adicionar JSON-LD sem um deploy do CMS — e precisa ser idempotente em casos ausentes, duplicados e não HTML. Redirecionamentos em escala pertencem a KV ou D1; Bulk Redirects/Rules são mais simples para conjuntos pequenos, mas escolha um responsável por URL para evitar conflitos. Três coisas compartilham o nome cache — Workers Cache API, cache de borda da Cloudflare e Cache-Control da origem — e confundi-las faz uma tag parecer não ter sido publicada; diagnostique por chave, camada, TTL e invalidação. A regra absoluta é cloaking: aplique lógica idêntica ao Googlebot e aos usuários. O problema mais específico dos Workers é o Bot Fight Mode bloquear o Googlebot em um pipeline que as regras de permissão do WAF não alcançam. Publique toda mudança que afete SEO com metadados de versão e rollback testado, depois verifique com a Inspeção de URL do GSC e o cabeçalho CF-Cache-Status.
TL;DR — Cloudflare Workers são pequenos programas executados na rede da Cloudflare, à 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 pela equipe de desenvolvimento. Esta página é a versão prática e voltada ao código da ideia mais ampla de Edge SEO: como fazer isso especificamente com Workers. Há uma regra que você não pode quebrar: tudo que um Worker altera precisa mudar da mesma forma para o Google e para visitantes reais. Mostrar algo diferente ao Google é cloaking.
O que é um Cloudflare Worker, em termos simples
Se seu site usa a Cloudflare, toda solicitação de um visitante (ou do Googlebot) passa pela rede da Cloudflare antes de chegar ao servidor real. Um Worker é um pequeno script que você executa nesse ponto do caminho. Ele vê a solicitação chegando e a resposta saindo, e pode alterar qualquer uma delas. Evidência desta afirmação Cloudflare Workers run code on Cloudflare's network and can inspect or modify requests and responses. Escopo: Cloudflare Workers request handling. Confiança: alta · Verificado: Cloudflare Workers: How Workers works
Esse é todo o apelo para SEO: você consegue corrigir páginas que, de outra forma, não poderia editar. Preso em uma plataforma fechada? Esperando semanas para uma pessoa desenvolvedora adicionar uma tag canonical? Um Worker pode fazer isso em minutos, ao vivo, sem um deploy no próprio site.
Para que as pessoas usam Workers em SEO
- Redirecionamentos — enviar URLs antigas para novas na borda, mesmo milhares delas.
- Corrigir ou adicionar tags — injetar canonical, corrigir título, adicionar hreflang ou dados estruturados — tudo sem editar o código-fonte da página.
- Reescrever cabeçalhos — adicionar ou corrigir itens como
X-Robots-Tag.
A regra que você não pode quebrar
Tudo que o Worker faz precisa ser aplicado a todos. Se você mostra ao Googlebot uma página diferente da vista por uma pessoa real — para manipular rankings — isso é cloaking e viola as regras do Google. Evidência desta afirmação Google defines serving materially different content to search engines and users to manipulate rankings as cloaking and a spam-policy violation. Escopo: Google Search spam policy; legitimate personalization is context-dependent. Confiança: alta · Verificado: Google: Spam policies — cloaking O padrão seguro é simples: aplique a mesma lógica a toda solicitação, não importa quem esteja pedindo. (O hub de Edge SEO trata essa regra em profundidade — esta página presume que você já entendeu o conceito e quer a implementação específica da Cloudflare.)
As duas formas de prejudicar o próprio site
A maioria das histórias de que “a Cloudflare prejudicou meu SEO” nem envolve o código do Worker:
- Uma configuração que bloqueia bots. O Bot Fight Mode da Cloudflare pode bloquear ou desafiar o Googlebot por engano. Se o Google não consegue buscar suas páginas, nada mais importa.
- Confusão com cache. A Cloudflare tem mais de um tipo de cache e, se você não souber qual está alterando, uma mudança publicada pode parecer que “não apareceu”.
Quer o código de verdade — um handler fetch, um exemplo de HTMLRewriter, uma
tabela de redirecionamentos em KV — além dos detalhes sobre cache e bloqueio de bots?
Mude para a aba Avançado.
TL;DR — Um Cloudflare Worker só vê solicitações que correspondem à rota configurada e intercepta cada uma em um único handler
fetch, onde você faz três coisas em sequência: reescreve a solicitação, os cabeçalhos da resposta e o corpo da resposta comHTMLRewriter. Esse é o mecanismo real por trás de “injetar um canonical” ou “corrigir um título” — e ele precisa ser idempotente e testado em respostas ausentes, duplicadas e não HTML, não apenas no caminho ideal. Redirecionamentos em escala ficam em KV (consulta rápida por chave) ou D1 (relacional); Bulk Redirects/Rules atendem conjuntos pequenos de modo mais simples, e em geral prefiro redirecionamentos na borda aos do servidor — mas escolha um responsável por URL, pois um redirecionamento do Worker, um Bulk Redirect e um da origem podem ser acionados no mesmo caminho. Três coisas diferentes compartilham a palavra “cache” — Workers Cache API (caches.default), cache de borda da Cloudflare eCache-Controlda origem — e confundi-las costuma causar “minha tag não apareceu”; diagnostique conteúdo desatualizado por chave, camada, TTL e invalidação, em vez de adivinhar. As orientações do Google sobre ETag / If-None-Match / 304 podem ser aplicadas diretamente por um Worker responsável pela resposta. A linha do cloaking: lógica idêntica para todos. O maior risco específico de Workers causado pela própria equipe é o Bot Fight Mode, executado fora do WAF Ruleset Engine, de modo que regras comuns de “allow” não o alcançam. Publique toda mudança de SEO com metadados de versão registrados, rollback testado e condição de interrupção — depois valide com a Inspeção de URL do GSC eCF-Cache-Status.
O que este artigo é (e o que não é)
Este é o complemento prático e voltado ao código do hub de Edge SEO.
O hub reúne a definição geral, a tabela de comparação entre plataformas (Workers,
Akamai, Fastly, Lambda@Edge, Vercel, Netlify), a decisão Snippets versus Workers e o
tratamento completo da regra de cloaking. Não repetirei tudo aqui. Esta página desce
um nível e trata especificamente do Cloudflare Workers — o runtime em que o Worker
deste próprio site é executado, conectado por run_worker_first em wrangler.toml —
com APIs reais, em vez de afirmações vagas de que “edge compute pode injetar tags”.
Uma observação antes do código: o Google não tem documentação específica sobre Cloudflare Workers. As orientações oficiais que regem esta implementação (política de cloaking, cache HTTP e rastreamento via CDN) são gerais e valem para qualquer implementação na borda. Prefiro dizer isso claramente a insinuar que existe um documento do Google que não existe.
Como um Worker entra no caminho da solicitação e da resposta
Um Worker é um script serverless executado em isolates V8. Toda solicitação roteada
até ele entra por um handler fetch. Evidência desta afirmação A Cloudflare Worker receives HTTP requests through a fetch handler. Escopo: Cloudflare Workers handlers. Confiança: alta · Verificado: Cloudflare Workers: Fetch handler
“Roteada até ele” é uma parte importante: o Worker só vê solicitações que correspondem
à rota ou ao domínio personalizado
configurado — tudo o mais jamais chega ao handler fetch. Quando duas rotas podem
corresponder à mesma URL, o padrão mais específico tem precedência; antes de confiar
no comportamento de um Worker para uma URL, confirme se a rota realmente corresponde
e qual versão implantada está ativa nela (ambientes Wrangler e rollouts graduais
significam que a versão que atende tráfego nem sempre é a que está no editor). Dentro
do handler, você pode fazer três coisas distintas, nesta ordem:
- Reescrever a solicitação antes que ela siga para a origem.
- Reescrever os cabeçalhos da resposta no caminho de volta.
- Reescrever o corpo da resposta — com
HTMLRewriter.
Esta é a estrutura 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 com Cloudflare Workers, construiu suas ferramentas como uma cadeia de filtros — um filtro de solicitação, um de resposta e um de corpo. É o mesmo padrão de três fases; apenas recebeu outros nomes. Manter essas fases separadas na cabeça mantém o Worker legível.
Reescrevendo HTML com HTMLRewriter
HTMLRewriter é o parser de streaming de HTML da Cloudflare e a API real por trás
de todo truque para “injetar uma tag”. Evidência desta afirmação Cloudflare HTMLRewriter provides selector-based handlers that can transform streamed HTML elements. Escopo: Cloudflare Workers HTMLRewriter API. Confiança: alta · Verificado: Cloudflare Workers: HTMLRewriter
Você registra handlers de elementos com .on(selector, handler), e o handler recebe
getAttribute / setAttribute, prepend / append, setInnerContent e replace.
Como trabalha por streaming, não é preciso carregar 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 canonical, associe um handler a head e use append para
adicionar uma, em vez de editar uma tag existente. Em qualquer caso, lembre a lição
da canonicalização:
rel=canonical é uma sugestão, não uma ordem — um Worker permite defini-la de modo
consistente em toda a plataforma, mas o Google ainda decide.
O CanonicalHandler acima presume que a tag existe e que a resposta é HTML. Nada
disso é garantido em produção, e errar aqui é como você acaba com duas tags canonical
na mesma página, em vez de uma. Antes de publicar uma reescrita assim, torne-a
idempotente e teste-a em:
- Nenhuma canonical existente — o handler precisa detectar a ausência e usar
appendemhead, não simplesmente deixar de fazer algo quandolink[rel="canonical"]não encontrar correspondência. - Uma canonical duplicada ou malformada já presente — decida se removerá a tag perdida ou deixará a reescrita adicionar uma segunda (isso é um bug real, não um caso raro — canônicos duplicados são um problema comum criado pela própria equipe).
- Uma resposta não HTML — uma rota de API, imagem ou redirecionamento que passe
pelo mesmo Worker não deve entrar no
HTMLRewriter; limite a transformação às rotas e aos tipos de conteúdo efetivamente verificados. - Executar a transformação duas vezes na mesma resposta (nova tentativa ou
fetchaninhado) — confirme que ela não adiciona uma segunda tag.
Adicionando ou corrigindo alternativas hreflang
O mecanismo é o mesmo, orientado por configuração. Adicione um
link[rel="alternate"] por locale a head. Se as alternativas forem por locale e
relacionais, a configuração pertence ao D1; para consulta simples, KV funciona. O
ponto é que HTMLRewriter as injeta de forma idêntica para todos — sem ramificar por
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 aparecem em escala
Uma afirmação concorrente que eu contestaria é “menos de um milissegundo, sem
restrições”. O teto real é o tempo de CPU: 10 ms no plano gratuito, 30 ms nos
pagos (tempo de relógio esperando por fetch não conta — tempo de CPU conta). Em
reescritas comuns, você nunca perceberá. Em passagens pesadas de HTMLRewriter por
páginas muito grandes, é uma restrição real a considerar no projeto, não alarmismo.
Redirecionamentos na borda: KV versus D1 versus Rules
Em geral, prefiro redirecionamentos na borda (no nível da CDN) aos do servidor — isso tira trabalho da origem e é aplicado antes mesmo de a página ser gerada. Na Cloudflare, meu guia da Ahrefs sobre redirecionamentos para SEO mostra várias opções: redirecionamentos individuais ou em massa, Redirect Rules, Page Rules, Workers com pares chave-valor ou um Worker que altera cabeçalhos para adicionar um redirecionamento.
Para uma tabela orientada por Worker, KV é o lugar natural: uma consulta rápida e com consistência eventual, cuja chave é a 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 locale, por segmento, com SQL que você quer consultar). E saiba quando um Worker é exagero: para um conjunto pequeno e estático, Bulk Redirects ou Redirect Rules da Cloudflare são mais simples e dispensam código. Não crie um Worker KV manualmente para cinquenta redirecionamentos.
Escolha um responsável por URL e não permita que um redirecionamento do Worker, um Bulk Redirect, uma Redirect Rule e um redirecionamento da origem sejam aplicados ao mesmo caminho — são sistemas separados que podem ser acionados na mesma solicitação; quando mais de um corresponde, você depura precedência em vez de um redirecionamento limpo. Antes de adicionar qualquer redirecionamento, verifique se ele já existe nos outros sistemas e escolha a camada conforme a complexidade da correspondência (simples 1:1 ou padrão), escala e quem precisa observá-lo ou revertê-lo — um redirecionamento do Worker fica no código e nos logs; um Bulk Redirect ou Rule fica no painel e é mais fácil para alguém sem conhecimento de desenvolvimento auditar ou reverter.
Cache: três coisas diferentes, um nome confuso
Esta é a seção que páginas concorrentes ignoram e que gera mais confusão do tipo “por que minha mudança não apareceu?”. Três camadas distintas compartilham a palavra cache:
- Workers Cache API —
caches.defaultecaches.open(). É um cache programável e específico do Worker, lido e gravado por código. - Cache de borda da Cloudflare — o cache da CDN que serve seus ativos. É distinto da Cache API.
Cache-Controlda origem — os cabeçalhos definidos pela origem (ou pelo Worker), que influenciam as duas opções acima e o comportamento do Googlebot.
Misture os três e você terá certeza de que uma mudança não foi publicada, quando ela apenas está sendo servida por uma camada que você não limpou.
Quando uma mudança realmente não aparecer, não adivinhe — diagnostique camada por camada:
- Chave do cache. Quais atributos da solicitação determinam se duas solicitações encontram a mesma entrada em cache (URL e, às vezes, cabeçalhos ou cookies, caso façam parte da chave)? Uma reescrita que varie por algo ausente da chave 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. - Local/estado. O cache da Cloudflare é distribuído por data centers — uma limpeza ou um deploy novo não invalida necessariamente todos os pontos de borda no mesmo instante.
- TTL e a regra que o definiu. Confirme se o TTL é controlado por Cache Rule,
cabeçalho
Cache-Controlda origem ou cabeçalho definido pelo próprio Worker. - Invalidação. Você limpou uma URL, limpou tudo ou esperou o TTL expirar? Uma
entrada da Cache API controlada pelo Worker (
caches.default) exige seu própriodelete()explícito — limpar o cache da CDN não a afeta.
O que o Googlebot faz com ETag / If-None-Match / 304
Se o Worker gera ou reescreve a resposta, ele controla os cabeçalhos de cache — por
isso, as orientações do Google de dezembro de 2024 podem ser aplicadas diretamente.
O Google aceita cache HTTP heurístico com ETag/If-None-Match e
Last-Modified/If-Modified-Since, recomenda fortemente ETag
porque tende a provocar menos erros e informa que, quando o ETag do crawler
corresponder, o servidor deve retornar 304 Not Modified sem corpo. Um Worker que
gera a resposta pode implementar isso: calcular ETag, compará-lo a If-None-Match
e devolver 304 diretamente — poupando processamento e oferecendo ao Googlebot um
sinal rápido e armazenável em cache.
A contrapartida de max-age para novo rastreamento
O Google também recomenda considerar Cache-Control: max-age para ajudar crawlers a
decidir quando rastrear novamente. O problema para um Worker que reescreve HTML: um
max-age agressivo em uma página cujas tags injetadas acabaram de mudar pode adiar
a descoberta da atualização pelo Googlebot. Não aplique uma duração longa a HTML
reescrito e esqueça o assunto.
A fronteira do cloaking aplicada a Workers
A regra absoluta, em termos de Workers, é executar a mesma lógica para todos. A política antispam do Google define cloaking como apresentar conteúdo diferente a usuários e mecanismos de busca para manipular rankings e cita especificamente inserir texto ou palavras-chave apenas quando quem solicita é um mecanismo de busca.
Alguns esclarecimentos, porque é comum exagerar na correção:
- Inspecionar o User-Agent não é cloaking automaticamente. Registrar tráfego de bots ou servir uma resposta em cache mais rápido a qualquer cliente não tem problema. A linha é uma diferença de conteúdo por identidade de quem solicita, feita para manipular rankings.
- Testes A/B com divisão de páginas em Workers são permitidos. Dividir usuários por URL e tratar todos da mesma forma é legítimo. Dividir conforme quem pede — bot versus pessoa — não é.
Um exemplo prático do padrão seguro: o 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 a todos sem o cookie — inclusive ao Googlebot.
Esse é exatamente o formato seguro: ele não esconde uma coisa de bots e mostra outra
a usuários; aplica uma única regra uniformemente.
E não dependa de uma etapa de pré-renderização exclusiva para bots, mesmo que seja implementada corretamente em Workers. O Google chamou a renderização dinâmica de solução alternativa, 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 desacelerar o Googlebot por acidente
Esta é a forma mais específica de Workers de causar o próprio problema, e geralmente não está no código do Worker.
O Bot Fight Mode é executado fora do Ruleset Engine
Bot Fight Mode (e Super Bot Fight Mode) pode gerar falsos positivos contra crawlers legítimos, inclusive o Googlebot. A armadilha: o Bot Fight Mode é avaliado em um pipeline separado do WAF Ruleset Engine; portanto, regras comuns de “allow” ou “skip” do WAF não o substituem. Se o Bot Fight Mode desafiar o Googlebot, uma regra de permissão não resolve — é preciso 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 — produtos de bots mudam.)
O padrão de regra personalizada para bots verificados
A Cloudflare expõe o campo cf.client.bot e um
padrão de permissão de bots verificados
para autorizar crawlers conhecidos em regras personalizadas — útil do lado do WAF,
embora, como explicado acima, não alcance o Bot Fight Mode.
A CDN em si é neutra ou positiva
Para desfazer o mito: a Cloudflare como CDN não prejudica o SEO. A série 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 o Googlebot por engano com regras de WAF/bots e que um
503 é melhor do que um intersticial de verificação de bot. O risco é um Worker ou
configuração de bots mal configurado, não a infraestrutura.
Verificando o que o Googlebot realmente recebeu
Depois de qualquer deploy do Worker, confirme o que o crawler realmente recebeu — não presuma:
- Inspeção de URL do GSC → Testar URL publicada. Busca a página como o Google e mostra o HTML renderizado, permitindo confirmar que canonical/hreflang/JSON-LD injetado realmente aparece.
- Verifique
CF-Cache-Statusjunto com o HTML.HIT/MISS/EXPIREDmostra se você está vendo uma resposta nova do Worker ou uma versão em cache — o modo mais rápido de encontrar uma “mudança que 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 que a string não comprova identidade; verifique o Googlebot real com DNS reverso + direto nos intervalos publicados pelo Google (veja a aba Scripts).
Higiene de implantação específica para Workers
Um wrangler deploy bem-sucedido informa que o script foi publicado — não que o
Googlebot recebeu a saída renderizada correta. Trate toda mudança do Worker que afete
SEO como um lançamento documentado, não apenas um push:
- Limite suas rotas. Não execute o Worker em
/*por padrão. Faça-o corresponder aos caminhos necessários nos padrões de rota dewrangler.toml, para que um bug não derrube o site inteiro. - Confira os limites atuais antes de prometer escala. Tempo de CPU, número de subrequests e tamanho do script variam por plano e ao longo do tempo — confirme na página atual de limites da Cloudflare antes de projetar uma reescrita com base em um teto específico, em vez de confiar em um número lembrado.
- Registre metadados de versão do lançamento. O modelo de versões e implantações da Cloudflare acompanha versão-fonte, data de compatibilidade, bindings e rotas de cada deploy — registre qual versão está ativa em qual rota, para que a afirmação “o Worker faz X” possa ser comparada ao que está implantado, e não ao editor.
- Versione e faça rollback com ambientes Wrangler. Publique em staging, faça rollout gradual por porcentagem e preserve a capacidade de retornar imediatamente à versão anterior.
- Use logs com escopo para acompanhar o rollout — considerando seus limites. Os Workers Logs e o tail de logs ajudam a depurar rollouts graduais, mas os logs são amostrados e retidos por pouco tempo — trate-os como evidência das solicitações capturadas, não como registro completo de toda visita de crawler.
- Defina uma condição de interrupção e teste o rollback antes de precisar dele. Decida de antemão qual comportamento observado (taxa de erros, resposta incorreta em uma verificação ou queda da taxa de rastreamento) interrompe o rollout e confirme que o rollback funciona, em vez de presumir.
- Limpe o cache como parte do deploy. Como há três camadas, torne a limpeza ou invalidação uma etapa explícita da publicação, não uma reflexão tardia.
Uma observação sobre o Bing e algo para o futuro
O Bing também não tem orientação específica para Cloudflare/borda. Porém, como um deploy do Worker é instantâneo e o rastreamento não, IndexNow é o par natural — acione-o assim que uma tabela de redirecionamentos ou mudança de tag do Worker for publicada, para que o Bing (e outros mecanismos participantes) rastreie novamente sem demora. Também vale observar que a Cloudflare lançou canonicalização aplicada na borda como recurso do produto (“Redirects for AI Training”) — crawlers verificados de treinamento de IA recebem um 301 para sua URL canônica com um botão. É um contraste útil com implementar a lógica canônica manualmente em seu Worker e um lembrete de que “servir algo diferente a crawlers e usuários” é um padrão sobre o qual a Microsoft expressou ceticismo público em outros recursos da Cloudflare para crawlers de IA — uma boa verificação intuitiva para qualquer Worker condicional por bot.
Para a visão mais ampla — comparação de plataformas, Snippets versus Workers, fila de desenvolvimento e governança — volte ao hub de Edge SEO.
Resumo por IA
Uma versão condensada da aba Avançado:
- SEO para Cloudflare Workers = fazer SEO técnico no runtime de isolates V8 da Cloudflare. É a implementação no nível do código e específica de Workers do conceito geral de Edge SEO — veja o hub para definição, comparação de plataformas e aprofundamento sobre cloaking.
- Um Worker só vê o que corresponde à sua rota. Configuração e precedência de
rota/domínio decidem quais solicitações chegam ao handler
fetch— confirme a rota e a versão implantada antes de confiar no comportamento do Worker para uma URL. - Um handler
fetch, três fases: reescrever a solicitação, os cabeçalhos da resposta e o corpo. A reescrita do corpo passa porHTMLRewriter— o mecanismo real para injetar canonical, corrigir hreflang ou adicionar JSON-LD. Torne a reescrita idempotente e teste respostas ausentes, duplicadas, malformadas e não HTML, não apenas o caminho ideal. - Redirecionamentos: KV para consultas rápidas por chave, D1 para configuração relacional, Bulk Redirects/Rules para conjuntos estáticos pequenos. Patrick prefere redirecionamentos na borda aos do servidor — mas escolha um responsável por URL; Worker, Bulk Redirect, Redirect Rule e 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 — misturá-los causa “minha mudança não apareceu”. Diagnostique por chave, camada, TTL e invalidação. - As orientações do Google sobre ETag/If-None-Match/304 (dezembro de 2024) são
diretamente aplicáveis: um Worker responsável pela resposta pode retornar 304
imediatamente; mas um
max-ageagressivo pode atrasar o novo rastreamento de uma página recém-alterada. - Regra de cloaking: lógica idêntica para todos. Inspecionar UA não é cloaking automaticamente; uma diferença de conteúdo por identidade para manipular rankings é.
- Maior risco criado pela própria equipe: Bot Fight Mode é executado fora do WAF Ruleset Engine, então regras comuns de permissão não o alcançam — é preciso mudar o próprio modo.
- Publique deliberadamente: confira os limites atuais do plano, registre metadados de versão (data de compatibilidade, bindings, rotas) por lançamento, use logs com escopo (amostrados, não completos) para acompanhar o rollout e defina condição de interrupção e rollback testado antecipadamente.
- Valide com Inspeção de URL do GSC (Testar URL publicada) e o cabeçalho
CF-Cache-Status; observe limites de CPU (10 ms gratuito / 30 ms pago) em reescritas pesadas.
Documentação oficial
Não existe documento do Google ou Bing específico sobre SEO para Cloudflare Workers — as orientações aplicáveis são gerais. As fontes primárias mais úteis se dividem entre os mecanismos de busca (política/cache) e a Cloudflare (APIs do runtime).
Google (aplicável a qualquer implementação na borda)
- Políticas antispam — cloaking — a fronteira absoluta que toda lógica do Worker precisa respeitar.
- Crawling December: cache HTTP (2024) — ETag / If-None-Match / 304 / max-age, aplicáveis diretamente por um Worker que controla a resposta.
- Crawling December: CDNs e rastreamento (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 de pré-renderização só para bots herda um padrão descontinuado.
- Visão geral dos crawlers e agentes de busca do Google — user agents e intervalos de IP publicados para verificação.
Cloudflare (o runtime)
- HTMLRewriter — a API de parser de streaming de HTML.
- Cache API —
caches.default/caches.open(). - Como o cache funciona — Cache API versus cache de borda.
- Rotas e domínios — correspondência, precedência e quais solicitações realmente acionam um Worker.
- Bulk Redirects — sistema sem código que pode entrar em conflito ou se sobrepor a redirecionamentos do Worker.
- Limites dos Workers — limites atuais de CPU, subrequests e tamanho de script; variam por plano e data, portanto consulte diretamente.
- Versões e implantações — deploys versionados/graduais e rollback.
- Workers Logs — logs de invocação, tail e limites de amostragem/retenção.
- Bot Fight Mode / Super Bot Fight Mode — configurações de bots que podem bloquear o Googlebot.
- Permitir tráfego de bots verificados — padrão da regra personalizada
cf.client.bot.
Bing — não existe página sobre borda/Workers; IndexNow é a combinação relevante para novo rastreamento imediato após o deploy.
Citações das fontes
Declarações registradas. Cada link do Google leva diretamente ao trecho citado.
Google — a fronteira do cloaking
- “Cloaking é a prática de apresentar conteúdo diferente a usuários e mecanismos de busca com a intenção de manipular os rankings de pesquisa e enganar usuários.” — Central da Pesquisa Google, Políticas antispam para a Pesquisa Google na Web. Ir para a citação
- “Inserir texto ou palavras-chave em uma página apenas quando o user agent que solicita a página é um mecanismo de busca, e não um visitante humano” — listado como exemplo de cloaking. Ir para a citação
Google — cache HTTP (Crawling December, 2024)
- “A infraestrutura de rastreamento do Google aceita cache HTTP heurístico conforme o padrão de cache HTTP, especificamente por meio do cabeçalho de resposta ETag e do cabeçalho de solicitação If-None-Match, além do cabeçalho de resposta Last-Modified e do cabeçalho de solicitação If-Modified-Since.” Ir para a citação
- “Recomendamos fortemente o uso de ETag porque é menos propenso a erros e equívocos (o valor não é estruturado como o valor Last-Modified).” Ir para a citação
- “Se o valor de ETag enviado pelo crawler corresponder ao valor atual gerado pelo servidor, o servidor deverá retornar um código de status HTTP 304 (Not modified) sem corpo HTTP.” Ir para a citação
- “Embora não seja obrigatório, considere também definir o campo max-age do cabeçalho Cache-Control para ajudar os crawlers a determinar quando rastrear novamente uma URL específica.” Ir para a citação
Google — renderização dinâmica (descontinuada)
- “A renderização dinâmica era uma solução alternativa, não uma solução de longo prazo para problemas de conteúdo gerado por JavaScript nos mecanismos de busca.” Ir para a citação
Eu — sobre redirecionamentos na borda
- “Em geral, prefiro redirecionamentos na borda (no nível da CDN) aos do servidor.” — do meu guia na Ahrefs, 11 tipos de redirecionamento e seu impacto no SEO. Transcrito do meu próprio artigo publicado; o texto é meu, mas confirme a formulação exata na página ao vivo antes de tratá-lo como citação literal.
Cloudflare / SALT.agency — por que usar Workers para redirecionamentos
- “precisávamos implementar redirecionamentos simples, algo que deveria ser fácil de criar na maioria das plataformas, mas não tinha suporte” — Igor Krestov e Dan Taylor, Mergulhando no SEO técnico com Cloudflare Workers (blog da Cloudflare). Transmitido por uma síntese do post da Cloudflare, sem confirmação como substring exata — verifique novamente a página ao vivo antes de usar como citação literal.
Qual ferramenta usar em cada trabalho?
“Preciso adicionar redirecionamentos.”
- Um conjunto pequeno e estático (algumas dezenas, sem lógica)? → Bulk Redirects ou Redirect Rules da Cloudflare. Sem Worker nem código.
- Milhares de redirecionamentos por URL? → consulta em Worker + KV.
- Redirecionamentos relacionais (por locale, por segmento, consultados)? → Worker + D1.
- Precisa redirecionar e reescrever cabeçalhos na mesma passagem? → Worker (Rules não fazem ambos).
“Preciso injetar ou corrigir uma tag (canonical, hreflang, título, JSON-LD).”
- → Worker com
HTMLRewriter. Não há produto sem código da Cloudflare para reescrita arbitrária do corpo; esse é o trabalho de Workers.
“O rastreamento do Googlebot caiu depois que adicionei a Cloudflare.”
- Primeiro suspeite de Bot Fight Mode / Super Bot Fight Mode, não do Worker. Verifique se ele está desafiando o Googlebot — e lembre que uma regra de permissão no WAF não resolve; é preciso mudar o próprio modo.
- Depois, verifique regras personalizadas do WAF e se um
503/intersticial está sendo servido aos bots. - Só então audite o código do Worker e o escopo da rota.
“Minha tag injetada não aparece.”
- Verifique
CF-Cache-Status.HIT/EXPIRED? Você vê uma resposta em cache — limpe a camada correta (Workers Cache API versus cache de borda) e teste novamente. MISSe ainda incorreto? Agora é a lógica do Worker ou o 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 SSR ou renderização estática aplicada a todos.
Lista de verificação de SEO para Cloudflare Workers
Antes de publicar um Worker de reescrita
- A rota está limitada aos caminhos necessários em
wrangler.toml— não/*por reflexo — e você confirmou qual versão implantada está ativa nela. - O Worker aplica lógica idêntica a todos (sem ramificação de conteúdo entre bot e pessoa).
- Handlers de
HTMLRewritersão idempotentes e foram testados contra tag ausente, existente duplicada/malformada e resposta não HTML — não apenas o caminho ideal. - Para redirecionamentos, você escolheu a ferramenta certa: Bulk Redirects/Rules (pequeno/estático), KV (por URL em escala) ou D1 (relacional) — e confirmou que nenhum outro sistema já controla a URL.
- Limites atuais do plano (CPU, subrequests, tamanho do script) foram consultados, não lembrados de memória.
-
Cache-Controlem HTML reescrito não é tão agressivo que atrase o novo rastreamento de páginas alteradas. - Metadados de versão (data de compatibilidade, bindings, rotas) foram registrados, com rollback testado e condição definida de interrupção do rollout.
Sanidade do cache
- Você sabe qual das três camadas (Workers Cache API / cache de borda /
Cache-Controlda origem) está alterando. - Se o Worker controla a resposta, ele define
ETagcorreto e consegue retornar304imediatamente. - Limpeza/invalidação do cache é uma etapa explícita do deploy.
Acesso de bots
- 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).
- Regra personalizada de bots verificados (
cf.client.bot) está ativa, caso o controle seja feito no lado do WAF. - Bots recebem
503, não intersticial de verificação, quando é preciso desacelerá-los.
Verificação após o deploy
- Inspeção de URL do GSC → Testar URL publicada confirma que a tag injetada aparece no HTML renderizado.
-
CF-Cache-Statusfoi conferido (HIT/MISS/EXPIRED), para saber se você vê uma cópia em cache. - IndexNow foi acionado (Bing/outros) caso uma tabela de redirecionamentos ou mudança de tag tenha acabado de ser publicada.
- Versão gerenciada por ambientes Wrangler, com caminho de rollback testado.
Os modelos mentais
1. Um handler, três fases.
Todo Worker é um handler fetch, e tudo que você faz pertence a uma de três fases em
ordem: reescrever a solicitação → reescrever os cabeçalhos da resposta →
reescrever o corpo da resposta (HTMLRewriter). Localize a mudança 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 mudança “não aparece”, pergunte qual camada você está vendo
antes de tocar no código.
3. O teste de cloaking: identidade versus lógica. Ramificar por quem solicita para mudar conteúdo = cloaking. Aplicar a mesma lógica a todos — ainda que ela inspecione o UA para logging ou velocidade — é permitido. Pergunte: “uma pessoa real receberia exatamente o que o Googlebot recebeu?”.
4. A ordem de suspeita para uma queda no rastreamento. Bot Fight Mode → regras do WAF → código do Worker → escopo da rota. As configurações de bots são executadas em um pipeline que suas regras de permissão não alcançam; portanto, suspeite delas primeiro.
5. O Worker controla a resposta — então controla a semântica do cache.
Se o Worker gera ou reescreve o corpo, ele é responsável por ETag, 304 e max-age.
Isso é uma capacidade (retornar 304 diretamente) e uma responsabilidade (exagerar no
cache e atrasar o 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, por chave de URL | Worker + KV |
| Relacional / por locale, consultado | Worker + D1 |
| Redirecionar e reescrever cabeçalhos | Worker |
Os três caches
| Camada | O que é | Como interagir |
|---|---|---|
| Workers Cache API | Programável, limitada ao Worker | caches.default, caches.open() |
| Cache de borda da Cloudflare | O cache da CDN | regras de cache / limpeza |
Cache-Control da origem | Cabeçalhos da resposta | origem ou Worker |
API de handlers do HTMLRewriter
getAttribute/setAttribute— ler/definir um atributo (por exemplo,hrefdo canonical)prepend/append— adicionar marcação em um elemento (por exemplo, uma tag emhead)setInnerContent— substituir o conteúdo do elementoreplace— substituir o elemento inteiro
Fatos rápidos
- Limite de CPU: 10 ms no gratuito / 30 ms no pago (espera de
fetchnão conta). - Cloaking = diferença de conteúdo por identidade para manipular rankings — não “o Worker leu o UA”.
- Bot Fight Mode é executado fora do WAF Ruleset Engine — regras de permissão não o alcançam; mude o modo.
- Verifique mudanças no Worker: Testar URL publicada no GSC + cabeçalho
CF-Cache-Status. - O Google recomenda
ETag; ETag correspondente → retorne 304 sem corpo.
Verifique o que o Googlebot realmente recebeu — depois de um deploy 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.comSe uma das verificações falhar, não é o Googlebot. Você também pode comparar com os intervalos publicados em googlebot.json.
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 atalho 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 construir e verificar SEO com Workers
- Wrangler — CLI da Cloudflare para desenvolver, versionar e implantar Workers (escopo de rotas, ambientes, rollback, segredos). É onde vive a higiene de deploy.
- HTMLRewriter — parser de streaming de HTML integrado; a API para toda reescrita do corpo.
- Workers KV / D1 — armazenamento de tabelas de redirecionamento e configuração (KV para consultas por chave, D1 para SQL).
- Inspeção de URL do GSC → Testar URL publicada — busca e renderiza a página como o Google, para confirmar se canonical/hreflang/JSON-LD injetado realmente apareceu.
- Cabeçalho
CF-Cache-Status(porcurl -Iou Network do DevTools) — informaHIT/MISS/EXPIRED, mostrando se você vê uma cópia em cache ou resposta nova do Worker. - IndexNow — notifica o Bing e outros mecanismos participantes no instante em que uma mudança feita por Worker é publicada.
- Análise de logs do servidor — a fonte da verdade para saber se o Googlebot real (verificado) está chegando às rotas do Worker.
Audite um Worker quanto à consistência de SEO e ao comportamento do cache
Revise este handler fetch do Cloudflare Worker como uma mudança de SEO na borda.
Percorra os fluxos de solicitação, cabeçalhos de resposta, reescrita do corpo,
redirecionamento e cache. Retorne:
1. Cada ramificação baseada em user agent, status de bot, cookie, geografia ou cabeçalho
2. Se o Googlebot/tráfego sem cookie pode receber conteúdo indexável ou tags de SEO diferentes
3. Seletores de HTMLRewriter que falham quando falta uma tag ou criam duplicatas
4. Consultas de redirecionamento que podem gerar cadeia, loop ou fallback inesperado
5. Cada uso da Cache API, comportamento do cache de borda da Cloudflare e Cache-Control da origem — tratados como camadas separadas
6. Chaves de cache que podem misturar variantes ou preservar mudança obsoleta de canonical/robots/cabeçalho
7. Uma matriz mínima de testes para usuários, bots verificados, cache hit/miss e URLs representativas
Aplique a mesma lógica de conteúdo e SEO a bots e usuários. Sinalize personalização
intencional para revisão humana, em vez de chamá-la automaticamente de cloaking. Não
invente configurações, bindings, rotas, regras de cache nem comportamento de origem
da Cloudflare que não estejam na minha entrada.
Código do Worker, bindings, rotas e configurações relevantes de cache/segurança:
[COLE A ENTRADA]Revise uma mudança do HTMLRewriter antes do deploy
Audite esta implementação do HTMLRewriter para uma tarefa de SEO: [CANONICAL / HREFLANG / JSON-LD].
Confira se ela trata elementos existentes, ausentes e duplicados; produz URLs absolutas
ou JSON válidos; aplica-se ao conjunto de rotas pretendido; e se comporta de forma
idêntica para todos. Depois, retorne o código corrigido e testes da resposta bruta e
da resposta renderizada.
Não adicione fatos sobre produto, organização, locale, URL ou schema que não tenham
sido fornecidos.
Código e saída esperada por rota:
[COLE A ENTRADA] Teste seus conhecimentos: SEO para Cloudflare Workers
Cinco perguntas rápidas sobre SEO técnico com Cloudflare Workers. Escolha uma resposta para cada uma e depois confira.
Recursos que valem seu tempo
Meus conteúdos relacionados
- 11 tipos de redirecionamento e seu impacto no SEO (Ahrefs) — opções de redirecionamento na Cloudflare e por que prefiro a borda ao servidor.
- Guia para iniciantes em SEO técnico (Ahrefs) — onde mudanças na borda entram no quadro geral.
- Problemas e boas práticas de SEO para JavaScript (Ahrefs) — o lado da renderização, relevante para qualquer tentação de pré-renderizar na borda.
Minhas palestras e entrevistas
- Ajuste seu SEO técnico, velocidade e segurança (entrevista no Marketing Speak) — explico como usar Cloudflare Workers para reescrever antes que o usuário veja a página e transferir redirecionamentos para a CDN. Transcrição de entrevista falada; trate formulações específicas como paráfrases, não citações exatas.
Do setor
- Mergulhando no SEO técnico com Cloudflare Workers — Igor Krestov (SALT.agency) e Dan Taylor no blog da Cloudflare; origem do padrão de cadeia de filtros (solicitação/resposta/corpo).
- O que é edge SEO? (Search Engine Land) — o conceito tratado pelo hub pai deste artigo, na visão de terceiros.
- Edge SEO (Dan Taylor) — da pessoa que cunhou o termo a partir da pesquisa com Cloudflare Workers.
- HTMLRewriter (documentação da Cloudflare) — referência canônica para a API de reescrita do corpo.
- Como o cache funciona (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 do produto, um contraste útil com implementá-la manualmente em um Worker.
Aprofunde ou explore temas relacionados
- Edge SEO — hub pai: conceito geral, comparação de plataformas, Snippets versus Workers e a regra de cloaking completa.
Registro de alterações
Atualizado em 2 de set. 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.
Não é possível fazer a comparação completa — nenhum instantâneo anterior foi arquivado para esta revisão.
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.