Como Configurar TTL e Cabeçalhos HTTP no Cloudflare para Cache no Edge

17 min de leitura Caching & CDN
Como Configurar TTL e Cabeçalhos HTTP no Cloudflare para Cache no Edge

Se seu conteúdo está sendo servido de forma inconsistente ou com dados desatualizados, o problema raramente é apenas no servidor; ele reside na complexa camada de cache intermediário (CDN e proxies). Entender como controlar precisamente os HTTP Headers, especialmente o Cache-Control: max-age e o Expires, é fundamental para garantir que seus usuários sempre recebam a versão mais fresca dos dados.

Ao final deste guia, você não apenas entenderá a hierarquia completa do cache (Browser -> CDN -> Origin), mas também saberá como utilizar as ferramentas avançadas da Cloudflare e de configuração de servidor (Nginx/Apache) para impor um controle de TTL granular em cada ponto de entrega.

Pré-requisitos

Para acompanhar este tutorial e implementar as configurações, é necessário ter acesso administrativo em múltiplas camadas do seu stack. Não basta apenas o servidor web; você precisa entender como ele se comunica com a rede de distribuição.

  • Acesso SSH/Root: A capacidade de modificar arquivos de configuração no servidor de origem (Nginx ou Apache).
  • Conhecimento Básico de HTTP: Entendimento dos métodos GET, POST e o ciclo Request/Response.
  • Conta Cloudflare Pro/Business: Embora os conceitos sejam aplicáveis a qualquer CDN, usaremos exemplos práticos com as configurações avançadas do painel da Cloudflare (requer acesso para modificar regras de cache).
  • Aplicação Web: Um ambiente web funcional que você deseja proteger e otimizar o cache.

Teoria Profunda: TTL, Cache-Control e Edge Caching

Antes de tocar nos comandos, é crucial entender a hierarquia do controle de cache. O termo TTL (Time To Live) não é um cabeçalho HTTP por si só; ele é o conceito que determina por quanto tempo um recurso pode ser considerado válido antes que uma nova checagem seja necessária.

O controle real é feito através de vários cabeçalhos, cada um falando para uma "audiência" diferente: o navegador do cliente (Browser), a CDN/Proxy intermediário (Edge) e, em último caso, o servidor de Origem. Ignorar essa distinção leva a problemas clássicos de cache desatualizado.

O que é Edge Caching?

Cache de borda (Edge Cache) refere-se à camada mais próxima do usuário final – geralmente operada por um CDN como Cloudflare. O objetivo principal é servir conteúdo estático sem nunca tocar no seu servidor de origem, reduzindo latência e protegendo contra picos de tráfego.

Atenção: Se você definir um TTL muito longo no Edge, mesmo que o conteúdo tenha sido atualizado no seu servidor de origem, os usuários continuarão vendo a versão antiga até que o cache expire ou seja purgado manualmente.

Análise dos Cabeçalhos Chave

Para garantir o controle máximo, você deve manipular pelo menos estes três cabeçalhos:

Cabeçalho O que controla? Escopo de Ação
Cache-Control Controle moderno, granular e preferencial. Define diretivas como max-age (tempo máximo) e no-cache/no-store (proibições). Browser, Proxy (Edge) e Origin. É o padrão ouro.
Expires Diretiva legada (HTTP/1.0). Define um timestamp absoluto de expiração. Deve ser usado em conjunto com o Cache-Control. Browser e Proxy mais antigos.
Pragma Diretiva obsoleta para compatibilidade. Usar apenas Cache-Control: no-cache é preferível. Compatibilidade de fallback.

Diretivas Cruciais do Cache-Control

Para atingir o controle máximo, você deve conhecer estas diretivas:

  • max-age=: Define quantos segundos o conteúdo é válido. Este é o TTL primário.
  • public: Indica que o cache pode ser armazenado por qualquer proxy (CDN). Use isso para recursos estáticos globais.
  • private: Indica que o cache só deve ser usado pelo navegador do usuário, e nunca por proxies intermediários (bom para dados de sessão ou perfil).
  • no-cache: Não significa "não armazenar em cache". Significa que, mesmo que possa estar em cache, o cliente DEVE sempre revalidar com o servidor de origem antes de usar a cópia local. **É essencial para conteúdo dinâmico.**
  • no-store: Proíbe estritamente o armazenamento do recurso em qualquer camada de cache (Browser ou CDN). Use para dados sensíveis que nunca podem ser repetidos.

Passo a passo: Impondo Headers no Servidor de Origem (Nginx/Apache)

O servidor de origem é o ponto de verdade. Se os headers forem definidos incorretamente aqui, todas as camadas acima e abaixo receberão informações falhas. Vamos focar em como garantir que Nginx ou Apache sempre enviem um conjunto robusto de cabeçalhos.

1. Configuração em Nginx (Recomendado para Performance)

A forma mais eficiente é adicionar o bloco de headers no seu arquivo de configuração do site (`/etc/nginx/sites-available/seusite`). Este exemplo assume que você quer um cache agressivo para imagens, mas exige revalidação para páginas HTML.

  1. Localize ou crie o bloco server: Edite o arquivo de configuração do seu domínio.
  2. Adicione os headers estáticos: Para ativos como CSS e JS (que raramente mudam), defina um TTL longo.
  3. Adicione os headers dinâmicos: Para arquivos HTML ou APIs, utilize no-cache para forçar a revalidação no Edge/CDN.
server {
    listen 80;
    server_name seu.dominio.com;

    # Configuração geral de cache agressivo para assets estáticos (JS, CSS, Imagens)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y; # Define o TTL como 1 ano (legado e moderno)
        add_header Cache-Control "public, max-age=31536000";
    }

    # Configuração para páginas HTML (que mudam frequentemente)
    location / {
        # Força a revalidação no Edge/CDN mesmo que o cache exista.
        add_header Cache-Control "public, max-age=60, must-revalidate";
        # Adicionar um token de versão ou timestamp ajuda muito na invalidação
        add_header X-Cache-Version $request_time; 
    }

    # Outras configurações...
}

2. Configuração em Apache HTTP Server (Via .htaccess ou VirtualHost)

Se você estiver usando o Apache, pode aplicar essas regras no arquivo `.htaccess` do diretório raiz. É mais fácil de implementar rapidamente, mas pode ser menos performático que a configuração nativa do `VirtualHost`.

# Habilitar módulos necessários

    # Para assets estáticos (JS, CSS, Imagens)
    
        Header set Cache-Control "public, max-age=31536000"
    

    # Para páginas HTML (Revalidação Forçada)
    
        RewriteEngine On
        # Aplica a regra de cache para qualquer requisição que não seja um asset estático
        
            Header set Cache-Control "public, max-age=60, must-revalidate"
        
    

3. O Papel do Vary Header

O cabeçalho Vary: Cookie, User-Agent, Accept-Encoding é vital para a granularidade do cache. Se o seu conteúdo muda dependendo de algum parâmetro da requisição (como um cookie de usuário ou o idioma), você deve incluir esse cabeçalho.

Importante: Incluir Vary: Cookie fará com que o Edge/CDN trate cada cookie como uma variação única, potencialmente invalidando o cache em um nível muito baixo e aumentando a taxa de chamadas ao seu servidor de origem. Use apenas quando estritamente necessário.

Passo a passo: Configurando o Controle de Cache na Cloudflare (Edge Layer)

Mesmo que você configure os headers perfeitos no seu servidor de origem, a camada Edge do CDN pode anular ou ignorar suas instruções. Portanto, é crucial complementar com as configurações avançadas da Cloudflare.

1. Verificação do Modo de Cache

  1. Acesse o Painel Cloudflare: Navegue até o seu domínio e localize a seção "Caching".
  2. Verifique o Level 1 (Browser): Este é o cache mais próximo, controlado pelos headers que você configurou no Nginx/Apache.
  3. Verifique o Level 2 (Edge/Cloudflare): Aqui você define as regras de TTL que o CDN deve seguir antes de consultar seu servidor de origem.

2. Ajuste do TTL na Configuração Global

Na seção "Caching" > "Configuration", ajuste os seguintes parâmetros para refletir a lógica definida no Nginx:

  • Edge Cache TTL (Cache-Control Max Age): Defina um valor de tempo razoável. Para conteúdo dinâmico, mantenha baixo (ex.: 5 minutos). Para assets estáticos e versionados, você pode usar valores mais altos.
  • Browser Cache TTL: Geralmente é melhor deixar o CDN controlar isso, mas certifique-se de que a política está alinhada com os seus Cache-Control headers no servidor.

3. Uso de Rules Engine (Workers/Transform Rules)

Para um controle verdadeiramente preciso e dinâmico (por exemplo: "Se o usuário for administrador, ignore o cache; caso contrário, use TTL de 1 hora"), você deve usar Cloudflare Workers ou Transform Rules.

  1. Crie uma regra no Worker: Utilize JavaScript para interceptar a requisição antes que ela chegue ao Edge.
  2. Manipule os Headers na Requisição/Resposta: Use `cf.headers` para forçar headers específicos de Cache-Control ou manipular o Vary header dinamicamente com base em parâmetros da URL.
// Exemplo conceitual de um Cloudflare Worker manipulando cache
export default {
    async fetch(request, env, ctx) {
        const url = new URL(request.url);
        let headers = request.headers;

        if (url.pathname.includes("/api/dados-sensive")) {
            // Para dados sensíveis, garantir que o cache seja impossível
            return Response.redirect(request.url, 302, {
                headers: {'Cache-Control': 'no-store, no-cache'}
            });
        } else if (url.pathname.includes("/assets/")) {
             // Para assets estáticos, garantir cache de longo prazo
            return Response.redirect(request.url, 200, {
                headers: {'Cache-Control': 'public, max-age=31536000'}
            });
        }

        // Se nenhuma regra for acionada, passar a requisição normalmente
        return fetch(request);
    }
}

Verificação e Teste: Confirmando o Comportamento do Cache

Configurar os headers é apenas metade do trabalho. É vital saber se as regras estão sendo aplicadas corretamente em todos os níveis (Browser, Edge, Origin).

1. Utilizando Ferramentas de Desenvolvedor

  1. Abra o DevTools: No Chrome ou Firefox, utilize a aba "Network".
  2. Desative o Cache: Marque a caixa Disable cache para garantir que você está vendo o comportamento em tempo real.
  3. Inspecione os Headers: Após carregar um recurso (ex.: style.css), clique nele e inspecione os "Response Headers". Você deve ver o Cache-Control, Expires e outros headers de cache listados pelos servidores que responderam.

2. Testando a Expiração (TTL)

Para verificar se um TTL está funcionando: A modifique intencionalmente o conteúdo do seu ativo estático no servidor de origem (ex.: altere uma linha em style.css). Depois, force o cache do navegador (Ctrl+Shift+R ou Cmd+Shift+R) e observe:

  • Se os headers estiverem corretos: O recurso deve ser baixado novamente, pois a modificação força um novo check.
  • Se o TTL for muito longo: Mesmo após modificar o conteúdo no servidor, o navegador pode exibir o cache antigo por um período de tempo definido pelo max-age anterior, até que o CDN ou o próprio browser purgue essa versão antiga.

3. Verificação de Cache Intermediário (Curl/Wget)

Para testar a camada Edge e Origin sem depender do seu navegador: use curl com flags específicas.

# Testando o cache de um asset estático, forçando headers
curl -I https://seu.dominio.com/assets/script.js | grep Cache-Control

# Testando para ver se a revalidação está sendo solicitada (se não houver cache)
curl -v -H "Cache-Control: no-cache" https://seu.dominio.com/page.html

A saída de curl -v mostrará os headers que o servidor retornou, permitindo confirmar se as diretivas como max-age=60 estão presentes.

Troubleshooting: Cenários de Cache Quebrados

Mesmo com a configuração mais avançada, problemas persistem. Estes cenários representam as causas mais comuns de conteúdo desatualizado em produção.

Problema 1: Conteúdo Desatualizado Após Deploy

Você atualizou o backend e salvou um novo dado, mas os usuários ainda veem a versão antiga. Isso é quase sempre falha no cache Edge/CDN.

  • Solução Imediata: Purge (Limpeza) do Cache. Acesse o painel da Cloudflare ou use a API para limpar o cache de todo o seu domínio (purge_everything).
  • Prevenção Permanente: Implemente um sistema de Versionamento de Assets. Em vez de /css/style.css, use /css/style.v20240515.css. Mudar o nome do arquivo obriga o CDN a buscar uma nova versão e ignora caches antigos.

Problema 2: Conflito entre Headers de Nginx e Cloudflare

Você definiu Cache-Control: max-age=31536000 no Nginx, mas o painel da Cloudflare está configurado para um TTL menor (ex.: 1h).

Regra de Ouro: A camada mais restritiva vence. Se o CDN diz "máximo de 1 hora" e o servidor diz "um ano", os usuários verão a versão por no máximo 1 hora, pois é o limite imposto pela Edge. Sempre use Cloudflare Workers ou Transform Rules para garantir que seu header de origem seja respeitado.

Problema 3: O Cache Não É Invalidado em Requisições Parciais

Se você usa APIs e altera um recurso específico, mas a requisição sempre passa por uma URL base (ex.: /api/dados), o cache pode ser acionado incorretamente.

  • Solução: Utilize cabeçalhos de validação condicionais. Adicione no Nginx ou Apache os headers ETag e Last-Modified com valores precisos do recurso. O cliente (ou CDN) enviará um If-None-Match com o ETag antigo, permitindo que você retorne um status 304 Not Modified em vez de todo o conteúdo novamente.

Perguntas Frequentes (FAQ) sobre Controle de Cache

O que é mais seguro: usar no-cache ou no-store?

Use no-store quando o dado for extremamente sensível e nunca deve ser repetido, mesmo em um proxy. Use no-cache para conteúdo que precisa de revalidação constante (como feeds ou dados transacionais). O no-cache não significa "não cachear", mas sim "revalidar antes de usar o cache".

Devo definir TTL diferentes para imagens e HTML?

Absolutamente. Imagens, fontes e scripts CSS/JS são recursos estáticos que podem ter um TTL alto (meses ou anos), desde que você implemente versionamento de arquivos (fingerprinting). O HTML, sendo dinâmico, deve ter um TTL baixo ou usar o método no-cache para forçar a checagem com o servidor.

É possível ignorar cache apenas para usuários Premium?

Sim. Isso requer lógica de aplicação mais avançada. A forma recomendada é verificar um cookie específico (ex.: is_premium=true) no seu backend e, se detectado, retornar os headers Cache-Control: no-store, independentemente das configurações globais do Nginx ou Cloudflare.

O que acontece se eu esquecer de incluir o cache em algum asset?

Se você não definir explicitamente um cabeçalho de cache para um determinado tipo de arquivo (ex.: SVGs), tanto o navegador quanto a CDN aplicarão seus padrões. Em ambientes corporativos, é melhor ser explícito e garantir que todos os assets estáticos tenham um TTL definido.

Conclusão

Dominar o controle de cache em diferentes camadas (Browser, Edge/CDN, Origin) eleva a performance do seu sistema além da simples otimização de imagens. O desafio não é apenas aplicar os comandos corretos de Nginx ou Cloudflare; é entender que cada cabeçalho HTTP tem um propósito e uma audiência específica.

Ao implementar o versionamento de assets, usar max-age para estáticos e forçar a revalidação com no-cache em conteúdo dinâmico, você garante não apenas velocidade, mas também **integridade dos dados** — um pilar fundamental na arquitetura web moderna.

Com este conhecimento profundo sobre TTL, Cache-Control e o fluxo de Edge Caching, sua infraestrutura está pronta para lidar com tráfego massivo sem sacrificar a experiência do usuário. Para implementar essa mesma robustez em todos os seus serviços e manter um controle granular sobre cada petabyte de dados transmitidos, considere otimizar toda sua arquitetura em uma plataforma cloud completa na Toda Solução.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000