O que é o cabeçalho Cache-Control?
Cache-Control é um cabeçalho de requisição ou resposta HTTP cujas diretivas regem o armazenamento, a validade, a revalidação e a reutilização por caches. Diretivas diferentes podem se aplicar a navegadores e intermediários compartilhados.
Como funciona o cabeçalho Cache-Control
Cache-Control comunica a política por meio de diretivas separadas por vírgulas, anexadas a uma requisição ou resposta HTTP. As diretivas de validade determinam quando a reutilização pode ocorrer sem consultar a origem, enquanto as diretivas de armazenamento, validação e escopo restringem o que caches privados e compartilhados podem reter ou servir. As diretivas de resposta são obrigatórias para um cache em conformidade, enquanto as diretivas de requisição são orientativas, e uma CDN pode ignorar aquelas que permitiriam a um cliente forçar uma consulta à origem: o Google Cloud CDN, por exemplo, ignora no-cache e max-age nas requisições. O cabeçalho se dirige a todos os caches no caminho ao mesmo tempo e não pode se dirigir a um cache específico, por isso a RFC 9213 define CDN-Cache-Control, um cabeçalho de resposta separado com as mesmas diretivas, que um cache de CDN compatível usa no lugar de Cache-Control.
Informações essenciais
no-cachepermite que uma resposta seja armazenada, mas exige validação bem-sucedida com a origem antes de cada reutilização;no-storeinstrui todos os caches, privados ou compartilhados, a não armazenar a resposta de forma alguma. A RFC 9111 acrescenta queno-storenão é um mecanismo confiável nem suficiente para garantir a privacidade, portanto é uma instrução de cache e não um substituto para o controle de acesso.max-agedefine o prazo de validade para todos os caches;s-maxageo substitui em caches compartilhados, como CDNs, e é ignorado pelos navegadores. Para um arquivo cuja URL muda sempre que seu conteúdo muda, o padrão da MDN é usarmax-agecom um prazo longo (o exemplo é de um ano) junto comimmutable, que indica que a resposta não será atualizada enquanto estiver válida.s-maxagetambém incorpora o significado deproxy-revalidate: quando a resposta expira, um cache compartilhado deve revalidá-la antes de reutilizá-la. Com Origin Cache Control habilitado, que é o padrão nos planos Free, Pro e Business da Cloudflare, a Cloudflare não serve uma resposta expirada coms-maxage, e o Google Cloud CDN documenta o mesmo comportamento, portantostale-while-revalidatenão tem efeito junto dessa diretiva nesses provedores. A alternativa documentada pela Cloudflare é usarmax-agecomstale-while-revalidatee uma regra separada de TTL nos nós de borda.privateimpede o armazenamento por caches compartilhados, mas permite o cache do próprio navegador, portanto é diferente de desabilitar o armazenamento em cache. Essa diretiva precisa ser definida deliberadamente em respostas personalizadas. Por padrão, o HTTP impede o armazenamento de uma resposta em caches compartilhados apenas quando a requisição contém um cabeçalhoAuthorizatione, mesmo nesse caso,public,s-maxageoumust-revalidateelimina essa restrição. Uma sessão enviada em um cabeçalho de requisiçãoCookienão aciona nenhuma regra desse tipo, e a RFC 9111 afirma que um cabeçalho de respostaSet-Cookienão impede o armazenamento em cache. O Google Cloud CDN não armazena em cache uma resposta que contémSet-Cookie. A Cloudflare, em seu nível de cache padrão, também não a armazena enquanto Origin Cache Control está habilitado, mas, com esse recurso desabilitado, pode armazenar a resposta em cache após remover o cabeçalhoSet-Cookie. Em ambos os casos, trata-se de um comportamento do provedor, não de uma regra do HTTP.- Uma resposta sem
Cache-Controlainda pode ser armazenada em cache. A RFC 9111 permite que um cache atribua um tempo de validade heurístico a uma resposta que admite armazenamento heurístico em cache e não tem expiração explícita, sugerindo no máximo uma fração do tempo decorrido desdeLast-Modified, e as CDNs aplicam seu próprio tempo de validade padrão quando a origem não envia nenhum. Os erros seguem as mesmas regras: uma resposta final com validade explícita pode ser armazenada, portanto uma resposta 5xx enviada com o longomax-ageusado para respostas bem-sucedidas pode ser armazenada e servida novamente por um cache posterior, embora os códigos de status armazenados por cada CDN dependam do provedor. Envieno-storeem tudo que não deve ser armazenado em cache e não atribua às respostas de erro os tempos de validade usados nas respostas bem-sucedidas. Uma CDN também pode armazenar erros em cache por uma configuração própria que o cabeçalho não desativa: o Amazon CloudFront ignorano-store,no-cacheeprivateem respostas 500, 502, 503 e 504 e as armazena em cache pelo período definido em Error Caching Minimum TTL, que é configurado por código de status e tem como padrão 10 segundos. Ele não armazena esses erros em cache quando o comportamento de cache usa a política de cache gerenciada CachingDisabled. - O cabeçalho da origem nem sempre tem a palavra final na borda. O Amazon CloudFront usa o TTL mínimo da política de cache quando ele é maior que 0, mesmo que a origem tenha enviado
no-cache,no-storeouprivate. Uma regra Edge Cache TTL da Cloudflare substituis-maxagee as diretivas de revalidação, e o modoFORCE_CACHE_ALLdo Google Cloud CDN armazena respostas bem-sucedidas em cache independentemente das diretivas da origem. Confira as configurações de TTL e de substituição da CDN antes de confiar em uma diretiva para manter uma resposta fora de um cache compartilhado.
Quando o cabeçalho Cache-Control é importante
Defina Cache-Control conforme a resposta seja pública, privada, imutável ou atualizada com frequência. Diretivas conflitantes ou permissivas demais podem expor dados privados ou preservar mídia desatualizada.
Como a Transloadit ajuda com o cabeçalho Cache-Control
Quando a Transloadit serve um arquivo transformado pelo Smart CDN, o Robot /file/serve define o cabeçalho Cache-Control do resultado, com um tempo de validade para o navegador em max-age e outro para o cache compartilhado em s-maxage. O parâmetro cache_duration do Robot define ambas as diretivas com um único valor, e o parâmetro headers mescla seus próprios valores de cabeçalho aos padrões, dando preferência aos seus valores. Para URLs assinadas do Smart CDN, o tempo de validade efetivo do cache também é limitado pelo tempo de validade restante da assinatura.
A página do Robot lista os tempos de validade padrão atuais.
Fontes
- RFC 9111, seção 5.2: Cache-Control
- RFC 9213: controle direcionado de cache HTTP (CDN-Cache-Control)
- RFC 5861: stale-while-revalidate e stale-if-error
- MDN: referência do cabeçalho Cache-Control
- Cloudflare: controle de cache na origem (comportamento das diretivas na borda)
- Amazon CloudFront: gerenciar por quanto tempo o conteúdo permanece no cache (configurações de TTL e cabeçalhos da origem)
- Amazon CloudFront: controlar por quanto tempo o CloudFront armazena erros em cache (Error Caching Minimum TTL)
- Google Cloud CDN: visão geral do armazenamento em cache (modos de cache e tabela de diretivas)