---
title: "Cabeçalho Vary: por que o site agêntico precisa dele | Grupo Marfre"
description: "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."
canonical: https://grupomarfre.com.br/sites-agenticos/cabecalho-vary/
alternate_html: https://grupomarfre.com.br/sites-agenticos/cabecalho-vary/
language: pt-BR
last_updated: 2026-10-27
type: guia
---
# Cabeçalho Vary: por que o site agêntico precisa dele

**Resposta rápida:** O cabeçalho Vary avisa ao cache que a resposta da mesma URL muda conforme o pedido. O navegador segue o padrão HTTP; a borda da Cloudflare só respeita o Vary configurado nas Cache Rules ou no Vary for Images, além do Accept-Encoding. Num site que serve HTML ou Markdown, o mínimo é Vary: Accept, mais User-Agent quando a regra olha o user-agent.

Quando a mesma URL devolve HTML para uma pessoa e Markdown para um robô, o cache precisa saber que há duas versões. O cabeçalho `Vary` faz esse aviso. Sem ele, um cache que guardou a primeira resposta pode entregá-la a quem pedir depois, mesmo que o pedido seja diferente.

Esta página trata só desse cabeçalho. Para a lógica de decidir o formato, veja [negociação de conteúdo](https://grupomarfre.com.br/sites-agenticos/negociacao-de-conteudo-markdown/). Aqui o foco é o que o cache faz com a decisão e como você confere isso com `curl`.

## O que o cabeçalho Vary faz?

O `Vary` lista os cabeçalhos do pedido que mudaram a resposta. Um cache que segue o padrão HTTP, como o do navegador, compara esses cabeçalhos antes de reaproveitar uma resposta guardada: o que foi guardado para um pedido com `Accept: text/html` não é entregue a um pedido com `Accept: text/markdown`, e vice-versa.

A borda da Cloudflare é um caso à parte. Segundo a documentação de cache dela, os valores do `Vary` só são respeitados quando o Vary é configurado nas Cache Rules ou no Vary for Images, ou quando o cabeçalho é `vary: accept-encoding`. Sem essa configuração, na borda só o `Accept-Encoding` conta. Se a resposta negociada fica guardada na borda, a separação por `Accept` ou `User-Agent` precisa ser configurada lá.

Uma resposta Markdown bem montada fica assim (domínio fictício):

```
HTTP/2 200
content-type: text/markdown; charset=utf-8
vary: Accept, Accept-Encoding, User-Agent
x-robots-tag: noindex
```

Na régua do Grupo Marfre, toda resposta do site leva `Vary: Accept, Accept-Encoding, User-Agent`, porque a regra decide também por user-agent, e o `.md` leva também `X-Robots-Tag: noindex` e fica fora do sitemap, para não virar conteúdo duplicado.

## O que dá errado sem o Vary?

Sem o `Vary`, o resultado depende de quem pediu primeiro. Três defeitos possíveis:

1.  **O robô recebe HTML em cache.** Uma pessoa abre a página, o cache guarda o HTML, e o agente que manda `Accept: text/markdown` recebe esse HTML. A camada agêntica existe, mas o agente não a enxerga.
2.  **A pessoa recebe Markdown.** Acontece o inverso: um agente pede primeiro, o cache guarda o `.md`, e o visitante abre a página e vê texto cru, sem layout.
3.  **O teste fica intermitente.** O mesmo `curl` devolve formatos diferentes em horários diferentes, e o defeito some e volta conforme o cache expira.

Um cache contaminado também pode entregar o `.md` a quem deveria receber a versão canônica, como Googlebot e Bingbot, que na régua do Grupo Marfre recebem o HTML. Não conte com o cache para resolver isso sozinho. Confira com o teste abaixo.

## Quando incluir User-Agent no Vary?

Inclua `User-Agent` só quando a regra da borda decide pelo user-agent. Na régua do Grupo Marfre, o espelho `.md` é servido a três tipos de pedido: `Accept: text/markdown`, `?mode=agent` e user-agent de robô de IA. Só o terceiro depende do user-agent.

| Gatilho do Markdown | O que o cache precisa saber |
| --- | --- |
| `Accept: text/markdown` | `Vary: Accept` |
| `?mode=agent` | a query string muda o endereço; confira se o seu cache a inclui na chave |
| user-agent de robô de IA | `Vary: User-Agent`, ou resposta fora do cache compartilhado |

Há um custo. Com `Vary: User-Agent`, cada string de user-agent distinta tende a virar uma entrada própria, e o cache perde eficiência. Se o seu cache sofre com isso, uma saída é marcar como não compartilháveis (por exemplo, com `Cache-Control: private`) as respostas que variam por user-agent. Se a regra não usa user-agent, não acrescente.

## Como conferir com curl -I?

Dispare o mesmo endereço com quatro pedidos e compare `content-type` e `vary`. Troque o domínio fictício pelo seu:

```
curl -I -H "Accept: text/html" https://www.exemplo.com.br/servicos/
curl -I -H "Accept: text/markdown" https://www.exemplo.com.br/servicos/
curl -I -A "GPTBot" https://www.exemplo.com.br/servicos/
curl -I -A "Googlebot" https://www.exemplo.com.br/servicos/
```

O resultado esperado, para uma regra como a do Grupo Marfre:

| Pedido | content-type esperado | Vary esperado |
| --- | --- | --- |
| `Accept: text/html` | text/html | contém Accept (e User-Agent, se a regra decide por user-agent) |
| `Accept: text/markdown` | text/markdown | contém Accept (e User-Agent, se a regra decide por user-agent) |
| `-A GPTBot` | text/markdown | contém Accept (e User-Agent, se a regra decide por user-agent) |
| `-A Googlebot` | text/html | contém Accept (e User-Agent, se a regra decide por user-agent) |

Depois faça o teste de cache. Repita a sequência na ordem HTML, Markdown, HTML, Markdown, sem esperar. Se o `content-type` mudar a cada pedido como no quadro, as versões não se misturam; o cabeçalho de status de cache que a sua CDN expõe mostra se elas saíram do cache ou foram geradas na hora. Se o segundo pedido repetir o formato do primeiro, o cache não está separando as versões: o `Vary` está ausente ou incompleto, ou, na Cloudflare, não foi configurado nas Cache Rules.

O `-I` envia um pedido HEAD, e alguns servidores respondem a ele de forma diferente do GET. Para ver os cabeçalhos do GET real, use `curl -s -D - -o /dev/null` no lugar de `-I`. Mais receitas estão em [como testar a camada agêntica com curl](https://grupomarfre.com.br/sites-agenticos/testar-camada-agentica-com-curl/).

## Onde configurar o Vary?

Configure no mesmo código que decide o formato. No método do Grupo Marfre, isso é um middleware na borda (Cloudflare Pages Functions) que cuida da negociação, do `Vary`, do cabeçalho `Link` e do `<link rel="alternate">`, além do 404 em Markdown. Um passo a passo está em [camada agêntica no Cloudflare Pages](https://grupomarfre.com.br/sites-agenticos/middleware-cloudflare-pages/).

O `Vary` vai em todas as respostas daquela URL, não só na Markdown. O HTML também precisa dizer ao cache que é uma variante, senão ele pode servi-lo a quem pediu Markdown.

Se você usa o [Markdown for Agents da Cloudflare](https://grupomarfre.com.br/sites-agenticos/markdown-for-agents-cloudflare/), a doc diz que a conversão acontece quando o pedido manda `Accept: text/markdown` e que ela só converte HTML. Ela não cobre user-agent de robô nem `?mode=agent`. Qualquer regra por user-agent precisa de outro ponto de configuração, e o cabeçalho final deve ser conferido com `curl`. O cabeçalho `Link` que aponta o `.md` está em [Cabeçalho Link (RFC 8288)](https://grupomarfre.com.br/sites-agenticos/cabecalho-link-rfc-8288/).

## Perguntas frequentes

### Preciso de Vary se só tenho um llms.txt?

Não. O `llms.txt` é um arquivo com endereço próprio e resposta única. O `Vary` importa quando a mesma URL muda de formato conforme o pedido.

### Posso usar só ?mode=agent e dispensar o Vary?

A query string muda o endereço, e um cache que a inclui na chave guarda essa versão à parte; confira isso no seu cache. Se a mesma URL também aceita `Accept: text/markdown` ou reconhece user-agent de robô, o `Vary` continua necessário.

### O Vary muda o que o Google indexa?

O `Vary` só informa ao cache que a resposta varia. Na régua do Grupo Marfre, Googlebot e Bingbot recebem o HTML canônico, e o `.md` leva `noindex`. O `Vary` serve para essa separação não se perder no cache.

### Como saber se o problema é o cache e não a regra?

Chame a URL com um parâmetro novo no fim (por exemplo, `?teste=1`) e compare com a URL limpa. Se a versão com parâmetro sai correta e a limpa não, a regra está certa e o cache guardou a resposta errada.

## Fontes consultadas

- [developers.cloudflare.com/cache/concepts/vary/](https://developers.cloudflare.com/cache/concepts/vary/)
- [developers.cloudflare.com/cache/concepts/cache-control/](https://developers.cloudflare.com/cache/concepts/cache-control/)

## 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 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.

### [Camada agêntica no Cloudflare Pages com Pages Functions](https://grupomarfre.com.br/sites-agenticos/middleware-cloudflare-pages/)

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.

### [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.

### [Como escrever um llms.txt bom (com modelo pronto)](https://grupomarfre.com.br/sites-agenticos/como-escrever-llms-txt/)

Como escrever um llms.txt bom: estrutura em 6 blocos, modelo pronto com a Padaria Exemplo, erros comuns e como conferir antes de publicar o arquivo.

---

## 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/cabecalho-vary/
