Calculadora de validade de cache HTTP
Informe os valores de Cache-Control, Expires, Date e Age de uma resposta, o horário em que ela foi recebida e o horário a verificar. A calculadora dá o tempo de frescor, a idade atual e se a resposta ainda está fresca.
O que esta calculadora faz
Ela cobre uma parte da RFC 9111, a norma de cache HTTP: o cálculo do frescor. É a parte que decide se uma resposta armazenada pode ser reutilizada sem consultar o servidor de origem. Validação (ETag, If-Modified-Since, 304), Vary e Cache-Control do lado da requisição não são abordados.
Frescor não é atualização nem exclusão
Uma resposta estar obsoleta significa apenas que um cache não pode reutilizá-la sem verificar antes. Não significa que a tela do navegador se atualiza sozinha, e não significa que o arquivo no servidor de origem é alterado ou excluído. Da mesma forma, uma resposta estar fresca não significa que o arquivo no servidor não mudou. O cabeçalho Expires, diz a norma, "does not imply that the original resource will change or cease to exist at, before, or after that time" (não implica que o recurso original mudará ou deixará de existir naquele momento, antes ou depois). Esta calculadora apenas faz a aritmética de tempo da cópia em cache.
Tempo de frescor e idade atual
- Tempo de frescor: o intervalo de tempo em que a resposta pode permanecer "fresca". É definido pela própria resposta (Cache-Control ou Expires) e não muda com o passar do tempo.
- Idade atual: o tempo que passou desde que a resposta foi gerada. Cresce com o passar do tempo.
- Está fresca? A resposta só está fresca quando o tempo de frescor é maior que a idade atual (quando são iguais, está obsoleta).
- Frescor restante = tempo de frescor − idade atual.
Qual valor define o tempo de frescor
Seguindo a seção 4.2.1 da RFC 9111, usa-se a primeira correspondência:
| Ordem | Cache compartilhado (CDN, proxy) | Cache privado (navegador) |
|---|---|---|
| 1 | s-maxage | (s-maxage não é usado) |
| 2 | max-age | max-age |
| 3 | Expires − Date | Expires − Date |
| 4 | Se nenhum estiver presente, não há expiração explícita | Igual |
- Se max-age estiver presente, Expires é ignorado. Em um cache compartilhado, se s-maxage estiver presente, max-age e Expires são ignorados (seção 5.3).
- Se a mesma diretiva aparecer mais de uma vez, usa-se a primeira (uma das abordagens que a norma permite).
- Um max-age ou s-maxage que não seja um inteiro, ou esteja entre aspas (a norma diz que um remetente não deve gerar a forma com aspas), é tratado como inválido, e a resposta é considerada obsoleta (tempo de frescor 0). Um valor acima de 2 147 483 648 é tratado como 2 147 483 648 (seção 1.2.2).
- Se Expires for
0ou uma data que não existe, a resposta é tratada como já expirada (seção 5.3). - Quando não há expiração explícita, o frescor heurístico (por exemplo, uma estimativa a partir de Last-Modified) não é calculado. A norma deixa o tempo de vida heurístico a cargo da implementação.
Como a idade atual é calculada
As fórmulas são da seção 4.2.3 da RFC 9111:
- Idade aparente = max(0, horário de recebimento − Date)
- Idade no recebimento = max(idade aparente, cabeçalho Age + atraso da resposta)
- Idade atual = idade no recebimento + tempo desde o recebimento
Esta calculadora não pede o horário em que a requisição foi enviada, então toma o atraso da resposta (o tempo do envio da requisição até o recebimento da resposta) como 0. Em uma conexão com grande atraso, a idade calculada pode ser menor que a real. A norma também permite usar apenas o cabeçalho Age mais o atraso.
Regras para a entrada
- Informe as datas como um IMF-fixdate (por exemplo,
Sun, 06 Nov 1994 08:49:37 GMT) ou como um horário UTC como2026-10-21 07:28:00. Tudo está em UTC (GMT); fusos horários não são tratados. O ano deve ir de 1900 a 2100, e os segundos de 0 a 59 (um segundo intercalar, 60, não é aceito). O nome do dia não é conferido com a data. - Os formatos RFC 850 e asctime são formatos que se espera que os destinatários HTTP aceitem, mas esta calculadora não os aceita. (Isso não significa que sejam inválidos em HTTP. Converta o valor para um IMF-fixdate.)
- Se Date estiver vazio, o horário que você informa em "Horário em que a resposta foi recebida" é usado no lugar de Date. A RFC 9110 diz que um destinatário que recebe uma resposta sem Date registra o horário do recebimento e o acrescenta como Date. Se esse horário também estiver vazio, os cálculos que precisam de Date (Expires − Date e a idade aparente) não podem ser feitos. O horário atual do navegador nunca é usado automaticamente; ele só é preenchido quando você aperta o botão "horário atual", no campo "Horário a verificar".
- O horário de verificação não pode ser anterior ao horário em que a resposta foi recebida.
Outras diretivas de Cache-Control
Não são usadas no cálculo, mas são mostradas como observações sobre a reutilização.
- no-store: não deve ser armazenada. private: um cache compartilhado não deve armazená-la (um navegador pode).
- no-cache (sem argumentos): mesmo enquanto fresca, não pode ser reutilizada sem validação.
- must-revalidate: uma vez obsoleta, não pode ser usada sem validação. proxy-revalidate: o mesmo, mas não se aplica a um cache privado.
- public: permite explicitamente o armazenamento.
- immutable (RFC 8246) e stale-while-revalidate e stale-if-error (RFC 5861) estão fora da RFC 9111. São reconhecidas, mas não usadas no cálculo.
Exemplos
| Entrada | Resultado |
|---|---|
| max-age=3600, sem Age, 1800 s depois do recebimento | Tempo de frescor de 3600 s, idade atual de 1800 s, restam 1800 s (fresca) |
| O mesmo, aos 3600 s exatos | Idade atual de 3600 s. É igual ao tempo de frescor, então está obsoleta |
| max-age=3600, Age=600, recém-recebida | Idade atual de 600 s, restam 3000 s |
| Cache compartilhado com s-maxage=60, max-age=3600 | Tempo de frescor de 60 s (max-age é ignorado) |
O que é bom saber
- Este é um cálculo baseado na norma. Navegadores e CDNs reais nem sempre se comportam exatamente como a norma descreve. Ações como um recarregamento forçado e configurações específicas de CDN podem dar resultados diferentes. O comportamento de um produto em particular não é garantido.
- Frescor heurístico, validação, Vary, diretivas de requisição e a soma de vários caches não são abordados.
Fontes e conferências
O seguinte foi conferido com o texto completo das normas em 1º de novembro de 2026:
- RFC 9111, "HTTP Caching": https://www.rfc-editor.org/rfc/rfc9111 (seções 1.2.2, 4.2.1, 4.2.3, 5.1, 5.2.2 e 5.3, incluindo o teste de frescor
freshness_lifetime > current_age) - RFC 9110, "HTTP Semantics": https://www.rfc-editor.org/rfc/rfc9110 (seções 5.6.7 e 6.6.1)
Esta calculadora segue essas seções apenas para o frescor. Passar por este cálculo não é uma afirmação de que um produto ou um servidor esteja em conformidade com a norma.
Perguntas frequentes
O que acontece quando max-age e Expires estão ambos presentes?
max-age tem prioridade e Expires é ignorado (RFC 9111, seção 5.3).
O s-maxage se aplica a um navegador?
s-maxage é uma diretiva para caches compartilhados. Um cache privado (um navegador) não a usa.
O que é o cabeçalho Age?
É o número de segundos, escrito por um cache no caminho, desde que a resposta foi gerada ou verificada pela última vez na origem. Esta calculadora o usa para achar a idade atual.
Uma resposta obsoleta desaparece ou se atualiza sozinha?
Não. Obsoleta significa apenas que um cache precisa verificar antes de reutilizá-la. Isso não atualiza a tela nem altera nada no servidor de origem.
Como posso conferir um horário?
O Conversor de timestamp Unix e a Calculadora de expressão cron podem ajudar.