Criar e analisar Cache-Control

Selecione as diretivas ou cole um cabeçalho existente. A análise verifica o texto, não o comportamento de um cache em uso.

Funciona localmente no seu navegador
Esta ferramenta processa todos os dados localmente no seu navegador.
Política de respostaEscolha a política que a resposta de origem enviará.
Inspecionar valor Cache-ControlCole somente o valor das diretivas ou uma linha completa de cabeçalho.

Como criar e analisar um cabeçalho Cache-Control

O painel de cima monta uma política de resposta: escolha uma visibilidade, informe um prazo de validade em segundos, marque as diretivas necessárias e clique em Criar cabeçalho. O cabeçalho que a página enviaria aparece na caixa Cabeçalho de resposta com um resumo de três linhas — quantas diretivas existem, qual é a validade da resposta e quais caches podem guardá-la — seguido de cada conflito que a combinação contém. O painel de baixo faz o caminho inverso: cole um valor copiado de uma resposta, de uma configuração de CDN ou de um log, clique em Inspecionar cabeçalho e leia o mesmo resumo para esse texto. Os dois painéis rodam neste navegador e a página continua funcionando sem conexão.

Cache-Control é o campo de resposta HTTP que diz aos caches por quanto tempo uma resposta pode ser reutilizada e o que precisa ser verificado antes: max-age e s-maxage definem o prazo para navegadores e caches compartilhados, no-store proíbe armazenar, no-cache permite armazenar mas exige validação, e immutable, stale-while-revalidate e stale-if-error refinam tudo isso. Esta ferramenta lê o texto do cabeçalho conforme a RFC 9111 e mostra o que um cache faria com ele. Ela nunca acessa uma URL, então não pode dizer o que o seu servidor, o seu CDN ou o cache do navegador realmente fazem em produção.

  1. Escolha o público em Visibilidade: public quando caches compartilhados podem guardar a resposta, private quando a cópia é de um único usuário, ou sem visibilidade explícita quando o campo não deve dizer nada sobre isso. A opção é escrita no cabeçalho exatamente como aparece.
  2. Informe max-age para os navegadores e s-maxage quando um CDN ou proxy reverso precisar do próprio prazo. As janelas opcionais — stale-while-revalidate e stale-if-error — e os cinco sinalizadores só entram se você usá-los. Os segundos são dígitos inteiros: 3600 e não 3600.9, que a página avisa em vez de arredondar sem dizer nada.
  3. Clique em Criar cabeçalho e leia a caixa Cabeçalho de resposta: ela traz a linha do campo como seria enviada, na ordem em que o formulário lista as diretivas. O resumo abaixo conta as diretivas, informa a validade e o escopo e lista cada conflito encontrado: public com private, no-store com um prazo, immutable sem max-age, s-maxage com private.
  4. Para conferir um cabeçalho que já existe, cole-o no segundo painel: a lista de diretivas sozinha ou a linha Cache-Control inteira. A forma entre aspas é lida corretamente, então no-cache="Set-Cookie, Authorization" continua sendo uma única diretiva. Nomes desconhecidos, duplicatas, delta-seconds entre aspas e valores que não são dígitos são avisados em vez de aceitos em silêncio.
  5. Copiar leva a linha para a área de transferência e Baixar salva o arquivo como cache-control.txt. Limpar devolve o formulário aos padrões — public com max-age=3600 — e esvazia os dois painéis, então a próxima execução parte de um estado conhecido. Quando um valor não pode ser lido, a linha de status indica o campo e o motivo, e a caixa do cabeçalho é esvaziada em vez de manter o resultado anterior.

Conflitos, delta-seconds e o que esta ferramenta não vê

Os conflitos que esta ferramenta avisa

public e private se contradizem: public marca a resposta como armazenável por caches compartilhados e private proíbe exatamente esses caches de guardá-la, então uma das duas precisa sair. no-store é a diretiva mais forte — nada pode ser armazenado —, o que torna max-age, s-maxage e as janelas de conteúdo vencido inúteis no mesmo cabeçalho; o resumo diz isso em vez de exibir um prazo que nunca será aplicado. s-maxage é lido apenas por caches compartilhados e private os exclui, então s-maxage ao lado de private não tem efeito.

immutable promete que o recurso não vai mudar enquanto estiver válido (RFC 8246); sem max-age ou s-maxage não há janela de validade para essa promessa cobrir. must-understand acompanha no-store, e um cache que entende os requisitos de cache daquele código de status ignora a parte no-store (RFC 9111, seção 5.2.2.3). A ausência de prazo também é avisada: sem max-age, s-maxage ou no-cache, um cache pode recorrer a uma heurística — normalmente um décimo do tempo desde o Last-Modified — e reutilizar a resposta sem consultar a origem.

Delta-seconds: os números que um cache aceita

max-age, s-maxage, stale-while-revalidate e stale-if-error usam delta-seconds, que a RFC 9111 define como um ou mais dígitos (seção 1.2.2): 0 é válido e significa vencido imediatamente, e o ponto decimal não faz parte da gramática. Um valor entre aspas como max-age="5" é avisado porque quem envia deve usar a forma de token (seção 5.2.2.1). Valores acima de 2147483647 segundos também são sinalizados: um cache que não consegue representar esse número deve lê-lo como 2147483648 segundos, mais de 68 anos, o que na prática significa nunca vencido.

A outra forma de argumento neste campo é a lista de nomes de campo entre aspas de no-cache e private, como no-cache="Set-Cookie". As vírgulas dentro dessas aspas pertencem à lista, por isso o analisador divide o campo pelas vírgulas fora das aspas e conta esse valor como uma única diretiva. Diretivas que um cache não reconhece são ignoradas por ele (seção 5.2.3), e é justamente por isso que um erro de digitação como maz-age=60 merece aviso: a resposta continuaria sendo servida e a regra simplesmente não existiria.

O que esta ferramenta não pode dizer

A página nunca envia uma requisição: ela apenas lê o texto do cabeçalho. Se um CDN, um proxy reverso ou um navegador respeitam o campo depende da configuração desse sistema e do código de status da resposta, e um cache pode armazenar uma resposta sem nenhuma diretiva se a considerar cacheável por heurística. Confira a política na resposta real — curl -I, os cabeçalhos de cache que o seu CDN informa ou o painel de rede do navegador — antes de confiar nela.

Dois vizinhos deste campo ficam de fora de propósito: Expires dá uma data absoluta em vez de um prazo, e Pragma é um campo de requisição do HTTP/1.0 que a RFC 9111 torna obsoleto (seção 5.4). Por isso uma linha que começa com outro nome de campo é recusada em vez de renomeada como Cache-Control. E como a verificação é textual, um cabeçalho impecável ainda pode estar errado para o conteúdo por trás dele: no-store em um arquivo estático ou um max-age de um ano em uma página que muda de hora em hora são decisões que nenhum analisador pode tomar por você.

Ferramentas recentes: