---
title: "Camada agêntica no Cloudflare Pages com Pages Functions | Grupo Marfre"
description: "Guia para montar a camada agêntica no Cloudflare Pages com Pages Functions (Markdown por Accept, Vary, Link, 404 em Markdown) e provar com curl."
canonical: https://grupomarfre.com.br/sites-agenticos/middleware-cloudflare-pages/
alternate_html: https://grupomarfre.com.br/sites-agenticos/middleware-cloudflare-pages/
language: pt-BR
last_updated: 2026-10-27
type: guia
---
# Camada agêntica no Cloudflare Pages com Pages Functions

**Resposta rápida:** A camada agêntica no Cloudflare Pages é um middleware em Pages Functions que serve o espelho .md a quem manda Accept: text/markdown, ?mode=agent ou user-agent de robô de IA, entrega HTML ao Googlebot e ao Bingbot, envia Vary e Link em toda resposta, devolve 404 em Markdown e barra arquivos como o README.

Num site estático no Cloudflare Pages, a camada agêntica cabe em um arquivo de middleware que roda antes de cada resposta. Ele decide se o visitante recebe o HTML ou o espelho em Markdown, acrescenta os cabeçalhos certos e trata os casos de erro. Este guia descreve a montagem usada na régua do Grupo Marfre.

A ideia é simples: o HTML continua sendo a página canônica e o `.md` é uma segunda leitura da mesma página, feita para agentes. O espelho é gerado da mesma fonte do HTML, nunca redigido à parte. Se quiser a visão geral do conceito, leia [negociação de conteúdo em Markdown](https://grupomarfre.com.br/sites-agenticos/negociacao-de-conteudo-markdown/).

## Como o middleware decide quem recebe Markdown?

O middleware lê três sinais em cada pedido: o cabeçalho `Accept` com `text/markdown`, o parâmetro `?mode=agent` na URL e o user-agent de robô de IA. Qualquer um dos três basta para servir o espelho `.md`, exceto para Googlebot e Bingbot, que recebem sempre o HTML (seção abaixo). Sem nenhum deles, a resposta é o HTML de sempre.

Pseudocódigo da lógica (não é um arquivo pronto, é o esqueleto):

```js
// functions/_middleware.js (pseudocódigo)
export async function onRequest({ request, next }) {
  const url = new URL(request.url);
  const ua = request.headers.get("user-agent") || "";
  const accept = request.headers.get("accept") || "";

  if (arquivoDeFerramenta(url.pathname)) return naoEncontrado(request);

  const buscadorClassico = /googlebot|bingbot/i.test(ua);
  const robotIA = /gptbot|oai-searchbot|chatgpt-user|claudebot|claude-searchbot|claude-user|perplexitybot|perplexity-user/i.test(ua);

  const querMarkdown =
    accept.includes("text/markdown") ||
    url.searchParams.get("mode") === "agent" ||
    robotIA;

  if (querMarkdown && !buscadorClassico) return servirMd(url, next);
  return servirHtml(next); // com Vary e Link
}
```

Dois cuidados sobre o regex. Na casa, o regex de robô de IA dos middlewares antigos tinha só `claudebot`, que não casa `Claude-SearchBot` nem `Claude-User`. Middleware novo nasce com `claude-searchbot|claude-user`. E `Google-Extended` não entra: é token de robots.txt, não user-agent, então colocá-lo no regex não faz nada.

A Cloudflare tem o recurso [Markdown for Agents](https://grupomarfre.com.br/sites-agenticos/markdown-for-agents-cloudflare/), que converte HTML em Markdown na borda quando o pedido manda `Accept: text/markdown`. Segundo a documentação (atualizada em 09/10/2026), ele só converte HTML e é beta. A casa não o testou, e ele não cobre user-agent de robô nem `?mode=agent`. Por isso a casa usa o middleware.

## O que Googlebot e Bingbot recebem?

Googlebot e Bingbot recebem sempre o HTML, que é a versão canônica. O espelho `.md` fica para agentes e para quem pede Markdown de forma explícita. Assim os buscadores clássicos enxergam uma única versão de cada página, sem conteúdo duplicado.

Duas travas completam isso. O `.md` leva `X-Robots-Tag: noindex` e não entra no sitemap, que lista só HTML. Se um buscador chegar ao `.md` por algum caminho, ele é orientado a não indexar.

## Quais cabeçalhos toda resposta leva?

Toda resposta, em HTML ou em Markdown, leva `Vary: Accept, Accept-Encoding, User-Agent` (a regra decide também por user-agent) e um cabeçalho `Link` apontando para o `.md`, o llms.txt e o sitemap. O `Link` mostra ao agente onde está a versão alternativa. O `Vary` diz ao navegador, que segue o padrão HTTP, que a mesma URL tem mais de uma versão. A borda da Cloudflare é outro caso: segundo a documentação de cache dela, sem configurar o Vary nas Cache Rules, só o `Accept-Encoding` entra na chave de cache.

```http
Vary: Accept, Accept-Encoding, User-Agent
Link: </servicos/site-agentico.md>; rel="alternate"; type="text/markdown",
      </llms.txt>; rel="describedby",
      </sitemap.xml>; rel="sitemap"
```

Os detalhes de cada um estão em [cabeçalho Vary](https://grupomarfre.com.br/sites-agenticos/cabecalho-vary/). Além do cabeçalho, a casa mantém um `<link rel="alternate" type="text/markdown">` no HTML, para o agente que lê só o corpo da página.

## Como o 404 funciona sem virar soft 404?

O 404 precisa existir de verdade na pasta e, para agentes, sair em Markdown. Sem `404.html` na pasta, o Cloudflare Pages entra em modo SPA e devolve a home com HTTP 200 em qualquer endereço inexistente. A casa achou esse problema, por controle negativo, em 3 sites.

A correção tem duas partes:

1.  Colocar um `404.html` na pasta publicada, para que o HTML responda 404 de verdade.
2.  Fazer o middleware devolver o 404 também em Markdown quando o pedido vier de agente, com um texto curto que aponta para o llms.txt e para a home.

Mais sobre o erro em [página 404 que o agente entende](https://grupomarfre.com.br/sites-agenticos/pagina-404-para-agentes/).

## O que nunca deve ser servido?

Arquivos de ferramenta que sobem junto no deploy, como README e configurações, precisam ser barrados com 404. Na casa, sem essa trava, um `/README` com cabeçalho de Markdown virava `/README.md` e saía inteiro para o robô.

Mantenha no middleware uma lista do que não se serve: README, arquivos de configuração e qualquer documento interno que esteja na pasta. O teste é simples: peça cada um deles e confira o 404.

## Como publicar e provar que funciona?

Publique de forma que a pasta `functions/` vá junto no deploy. Se o middleware não responde em produção, confira primeiro se ela subiu. Depois do deploy, a prova é feita com curl contra o endereço real, não contra o ambiente local.

Os cinco testes da casa (troque o domínio fictício pelo seu):

```bash
curl -s -D - -H "Accept: text/markdown" https://exemplo.com.br/servicos/ | head -n 30
curl -s -D - -o /dev/null -A "GPTBot" https://exemplo.com.br/servicos/
curl -s -D - -o /dev/null -A "Googlebot" https://exemplo.com.br/servicos/
curl -s -o /dev/null -w "%{http_code} %{content_type}\n" -H "Accept: text/markdown" https://exemplo.com.br/rota-que-nao-existe
curl -s -o /dev/null -w "%{http_code}\n" -A "GPTBot" https://exemplo.com.br/README
```

| Teste | Resultado esperado |
| --- | --- |
| `Accept: text/markdown` | Cabeçalhos com `Vary` e `Link`, seguidos do Markdown com frontmatter |
| `-A GPTBot` | `content-type: text/markdown` (o espelho `.md`) |
| `-A Googlebot` | `content-type: text/html` (o HTML canônico) |
| Rota inexistente | 404 com `text/markdown` |
| `/README` pedido como GPTBot | 404 |

Com os cinco passando, a casa pede um scan novo no is-agentic. Mais receitas em [como testar a camada agêntica com curl](https://grupomarfre.com.br/sites-agenticos/testar-camada-agentica-com-curl/).

## Perguntas frequentes

### Preciso de plano pago da Cloudflare para isso?

O recurso Markdown for Agents está disponível sem custo nos planos Pro, Business e Enterprise e para SSL for SaaS, segundo a documentação da Cloudflare. O middleware em Pages Functions é outro caminho. Confira na documentação da Cloudflare os limites do seu plano antes de contar com ele.

### Servir Markdown a robôs e HTML ao Googlebot é um problema?

O conteúdo é o mesmo, gerado da mesma fonte; muda o formato. O `.md` leva `noindex` e fica fora do sitemap. Para dúvidas de política, consulte as políticas de spam do Google.

### Posso pôr o Google-Extended no regex de robôs?

Não adianta. O Google-Extended é um token de controle do robots.txt e não aparece como user-agent nos pedidos. É a regra no robots.txt que controla se o conteúdo pode treinar o Gemini e servir de grounding no app Gemini e no Vertex AI.

### Mudei o middleware e nada mudou em produção. O que olhar?

Confira se a pasta `functions/` subiu junto no deploy. Depois rode os testes de curl contra o domínio de produção, sem cache no caminho.

## Fontes consultadas

- [developers.cloudflare.com/fundamentals/reference/markdown-for-agents/](https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/)
- [developers.cloudflare.com/cache/concepts/vary/](https://developers.cloudflare.com/cache/concepts/vary/)

## Leia também

### [Negociação de conteúdo: servir Markdown a quem pede Accept: text/markdown](https://grupomarfre.com.br/sites-agenticos/negociacao-de-conteudo-markdown/)

Negociação de conteúdo em Markdown: como servir o .md a quem manda Accept: text/markdown, ?mode=agent ou user-agent de IA, e testar tudo com curl.

### [Cabeçalho Vary: por que o site agêntico precisa dele](https://grupomarfre.com.br/sites-agenticos/cabecalho-vary/)

Cabeçalho Vary avisa ao cache que a mesma URL tem versão HTML e Markdown. Veja o que a borda da Cloudflare respeita, quando incluir User-Agent e como conferir.

### [Página 404 que o agente entende (e o soft 404 que engana)](https://grupomarfre.com.br/sites-agenticos/pagina-404-para-agentes/)

Página 404 para agentes de IA: por que endereço inexistente deve responder 404 e não a home com 200, o caso do Cloudflare Pages e como testar com curl.

### [Como testar a camada agêntica com curl (receitas prontas)](https://grupomarfre.com.br/sites-agenticos/testar-camada-agentica-com-curl/)

Receitas de curl para testar a camada agêntica: Accept text/markdown, ?mode=agent, GPTBot, Googlebot, Vary, Link, 404 e robots.txt, com a saída esperada.

### [Markdown for Agents da Cloudflare: o que é e quando usar](https://grupomarfre.com.br/sites-agenticos/markdown-for-agents-cloudflare/)

Markdown for Agents da Cloudflare converte HTML em Markdown para quem pede Accept: text/markdown. Veja planos, limites e quando o espelho gerado é melhor.

### [Cabeçalho Link (RFC 8288): como o agente descobre a versão em Markdown](https://grupomarfre.com.br/sites-agenticos/cabecalho-link-rfc-8288/)

Cabeçalho Link (RFC 8288): como apontar o espelho .md, o llms.txt e o sitemap por HTTP, com formato, exemplo e teste com curl, sem baixar o HTML.

---

## Sobre o Grupo Marfre

Grupo Marfre Automação e Tecnologia LTDA (CNPJ 49.685.676/0001-55): agência de marketing digital e inteligência artificial com base em Contagem/MG, que atende o Brasil inteiro de forma remota.

- Endereço: Alameda das Cotovias, 75, Cabral, Contagem - MG, Brasil
- WhatsApp: (31) 93618-7272, https://wa.me/5531936187272
- E-mail: contato@grupomarfre.com.br
- Instagram: https://instagram.com/marfregrupo
- Serviços: gestão de tráfego pago (Meta Ads e Google Ads), site agêntico (site pronto pra assistentes de IA lerem), site que vira contato, SEO e Google, IA no WhatsApp, CRM e automação
- Serviço de site agêntico: https://grupomarfre.com.br/servicos/site-agentico/ · serviço de gestão de tráfego: https://grupomarfre.com.br/servicos/gestao-de-trafego/
- Guias: https://grupomarfre.com.br/sites-agenticos/ e https://grupomarfre.com.br/gestao-de-trafego/
- Método em 4 etapas: Diagnóstico, Estratégia, Execução, Otimização
- Segmentos já atendidos: clínica, consultório, advocacia, loja, igreja
- Preço e escopo não são publicados: são definidos por diagnóstico, caso a caso
- Todas as páginas em Markdown: https://grupomarfre.com.br/llms.txt · conteúdo completo: https://grupomarfre.com.br/llms-full.txt

Página HTML equivalente: https://grupomarfre.com.br/sites-agenticos/middleware-cloudflare-pages/
