O cache HTTP poupa tempo e dados, pois só recarrega os recursos quando estes realmente mudam. Através de ETag e Última modificação Verifico, através de uma solicitação condicional, se o servidor responde com um código 304 Not Modified, o que reduz significativamente a transferência de dados e a carga do servidor.
Pontos centrais
As seguintes ideias-chave mostram o que tenho em mente quando falo de «Conditional Caching» com ETag e Última modificação atenção.
- Menos tráfego: Os ficheiros inalterados devolvem um código de estado 304, em vez de todo o corpo da resposta – o que reduz significativamente o volume de dados e a latência.
- Melhor desempenho: Tempos de espera mais curtos melhoram a experiência do utilizador (UX) e os Core Web Vitals, o que SEO ajuda.
- Dois mecanismos: Os cabeçalhos Last-Modified/If-Modified-Since e ETag/If-None-Match validam o cache de forma segura.
- Controlo da cache: As diretivas controlam a atualização, a revalidação e o comportamento nas caches intermediárias.
- Combinação: Em conjunto, ambos os métodos oferecem elevada precisão e soluções alternativas simples.
Primeiro, verifico quais os recursos que mudam com frequência e quais os que mudam raramente. Para os ficheiros que raramente são alterados, defino um Última modificação- e adiciono um ETag. Para respostas dinâmicas, prefiro utilizar o ETag, porque qualquer alteração no conteúdo fica imediatamente visível. Desta forma, alivio a carga nos servidores, reduzo as latências e ofereço páginas muito rápidas aos visitantes recorrentes. Esta estratégia reforça a Principais dados vitais da Web e, consequentemente, a visibilidade.
Cache condicional HTTP: como verificar a validade
Ao efetuar uma nova solicitação, o cliente envia, além do método GET, cabeçalhos adicionais que eu analiso no lado do servidor. Se o recurso tiver o mesmo ETag Se corresponder ao conteúdo da cache (If-None-Match), envio um 304 Not Modified sem corpo. Se o carimbo de data/hora não tiver mudado (If-Modified-Since), o servidor responde igualmente com 304. Se o dia ou a data já não estiverem corretos, envio 200 OK com novo conteúdo e Última modificação e ETag. Desta forma, poupo largura de banda, mantenho a cache atualizada e garanto tempos de carregamento visivelmente mais rápidos.
Last-Modified e If-Modified-Since no dia a dia
O cabeçalho Última modificação Utilizo a data e hora reais da última modificação do ficheiro, obtidas, por exemplo, do sistema de ficheiros. Se, posteriormente, chegar um pedido com o cabeçalho «If-Modified-Since» e o recurso não tiver sido alterado desde então, respondo com um código 304. Esta abordagem é simples, fácil de compreender e ideal para recursos estáticos como CSS, JS ou imagens. As limitações surgem devido à resolução de segundos dos carimbos de data/hora HTTP e em situações em que o conteúdo muda logicamente sem que exista uma data de arquivo precisa. Onde o Last-Modified atinge os seus limites, um ETag o controlo.
ETag e If-None-Match em sistemas dinâmicos
A ETag Gero-o como um hash, um ID de versão ou a partir de uma coluna da base de dados que marca as alterações de estado. Ao aceder novamente, o navegador envia If-None-Match, eu comparo o tag com o meu valor atual e respondo em conformidade com 304 ou 200. Esta comparação deteta qualquer alteração significativa no conteúdo, sem depender dos carimbos de data/hora dos ficheiros. Especialmente no caso de APIs, páginas compostas ou fragmentos personalizados, isto fornece resultados muito precisos. É importante manter os ETags consistentes em ambientes de cluster, para que nenhum servidor utilize acidentalmente um Dia produzido.
Combinar corretamente o Cache-Control
Com Controlo da cache Defino por quanto tempo os conteúdos são considerados atualizados sem necessidade de verificação e quando o navegador deve revalidá-los. Defino valores adequados para o atributo `max-age` de acordo com a frequência de alterações e utilizo `must-revalidate` quando dados desatualizados poderiam ser críticos. Para ficheiros versionados, é adequada uma validade longa, enquanto respostas que mudam frequentemente têm uma validade mais curta e podem ser verificadas de forma clara através do ETag ou da data. Assim, combino tempos de resposta curtos com atualidade correta. Quem quiser aprofundar o assunto encontrará muitos exemplos em Estratégias de Cache-Control, que utilizo na prática.
Processo de uma solicitação GET condicional, passo a passo
Na primeira solicitação, o servidor envia um 200 OK com Cache-Control, Última modificação e ETag, o navegador guarda tudo. Na visita seguinte, a data de validade no cache determina se é necessária uma revalidação. Se for o caso, o navegador faz a consulta com If-None-Match e/ou If-Modified-Since. Se os valores corresponderem ao estado atual, envio um 304 Not Modified, e o cliente continua a utilizar o seu cache. Se já não corresponderem, segue-se um 200 OK com um novo corpo e atualizado Dados de validação.
Comparação: ETag vs. Last-Modified
Ambos os métodos garantem-me controlo, mas diferem em termos de esforço, precisão e adequação. Última modificação destaca-se pela facilidade de implementação e pela semântica clara, desde que eu tenha carimbos de data/hora precisos. O ETag reflete o conteúdo com grande precisão, mas requer alguma lógica para ser gerado. Em muitas configurações, combino ambos e beneficio assim da simplicidade e do reconhecimento exato. A tabela seguinte resume as características típicas e ajuda na tomada de decisão.
| Aspeto | Última modificação | ETag | Nota |
|---|---|---|---|
| Identidade | Data e hora da última alteração | Hash do conteúdo ou ID da versão | Tempo vs. identificador baseado no conteúdo |
| Detecção de alterações | Resolução em segundos, indireta | Totalmente orientado para o conteúdo | O ETag deteta os mais pequenos Diferenças |
| implementação | Muito leve, o sistema de ficheiros é suficiente | Exige geração e consistência | Os clusters precisam de igualdade ETags |
| Utilização | Recursos estáticos | Respostas dinâmicas | Esta combinação abrange muitos Casos de |
| Respostas | 304 com carimbo de data/hora inalterado | 304 com data idêntica | 200 em caso de alterações com novo Valor |
Na prática: distribuir recursos estáticos de forma eficiente
Os ficheiros estáticos, como CSS, JS e imagens, raramente são alterados e são adequados para idade máxima-Tempos. Para ficheiros versionados, defino valores elevados, até um ano, e marco-os como imutáveis, para que o navegador os carregue sem solicitar confirmação. Para recursos sem versão, escolho prazos mais curtos e confio na revalidação através do ETag e do Last-Modified. Assim, evito conteúdos desatualizados e mantenho o tráfego baixo. Se tiver o cuidado de não Cabeçalho da cache de sabotagem Ao deixar isso assim, consigo uma elevada taxa de acertos na cache.
Na prática: APIs e páginas dinâmicas
No que diz respeito às APIs, costumo optar por ETags, que crio a partir do resultado serializado ou de uma coluna de versão. Se o registo for alterado, gerio uma nova data, e os clientes reconhecem isso imediatamente. Para conteúdos com carimbos de data/hora incertos, muitas vezes dispenso o Last-Modified, para que não se crie uma falsa impressão de atualidade. Além disso, controlo o tempo de vida através do Cache-Control e forço a revalidação após o prazo de validade. Assim, mantenho os dados atualizados de forma fiável, sem tornar as respostas desnecessariamente grandes.
Testes e monitorização da taxa de acertos do cache
Verifico cabeçalhos como ETag, Last-Modified, If-None-Match e If-Modified-Since nas Ferramentas do Desenvolvedor. Ao fazê-lo, presto atenção aos códigos de resposta, especialmente 304 vs. 200, para verificar a eficácia da minha revalidação. Se o 304 for raro, ajusto o Cache-Control, os períodos de validade e a geração do ETag. Os logs e as métricas mostram-me quais os caminhos que respondem com respostas desnecessariamente grandes. Para melhorias agrupadas, gosto de utilizar um Pacote de Pedidos Condicionais, que combina a configuração e os testes.
Arquitetura de alojamento e armadilhas do ETag
Em configurações com vários servidores, é necessário um ETag ser independente da instância, caso contrário, o reconhecimento falha. Asseguro-me de que todos os nós utilizam a mesma lógica e a mesma chave para a geração. Os proxies reversos ou as CDNs não devem alterar os ETags e devem reenviar corretamente os cabeçalhos de condição. Em implementações com impressões digitais de ativos, evito o recálculo de ETags do lado do servidor se o ficheiro já tiver uma URL versionada. Regras uniformes evitam respostas inconsistentes e mantêm a taxa de acertos do cache elevada.
Atualização vs. validação: utilizar as diretivas com precisão
Faço uma distinção clara entre Frescura (por quanto tempo um cache pode utilizar uma cópia sem consultar o servidor?) e Validação (como posso verificar se ainda é válida?). Sobre Controlo da cache controlo ambos com grande precisão: idade máxima define o tempo de vida no cliente, s-maxagem para caches partilhadas, como proxies. público permite o armazenamento em cache em caches partilhadas, privado limita-o ao navegador final. deve revalidar obriga a realizar consultas após o término, enquanto imutável evita revalidações desnecessárias no caso de recursos com versões. sem cache não proíbe o armazenamento em cache, mas exige sempre uma revalidação; não armazenar por outro lado, proíbe totalmente o armazenamento. Versões mais antigas Expirações- Utilizo o cabeçalho apenas como alternativa; transfiro sistematicamente a lógica para o Cache-Control. E quando quero atenuar eventuais falhas, isso ajuda obsoleto-enquanto-revalidado e estagnação em caso de erro, para partilhar conteúdos que expiram a curto prazo, enquanto atualizo em segundo plano ou contornou erros.
ETags fortes e fracas, compressão e variantes
Distingo deliberadamente entre validadores fortes e fracos. ETags fortes identificar a representação exatamente igual, byte a byte – ideal se eu também Pedidos de alcance deseja utilizar de forma eficiente. ETags fracos (Prefixo W/) são suficientes quando basta a equivalência semântica, por exemplo, no caso de pequenas alterações de formatação irrelevantes. O importante é a forma como se lida com Compressão: Se eu fornecer conteúdos codificados tanto em gzip como em Brotli, um único ETag não pode ser válido para todas as variantes. Ou calculo o ETag com base na representação não comprimida e defino adicionalmente um Vary: Aceitar-Codificação, ou então gerio ETags consistentes, mas diferentes, para cada variante. Desta forma, evito resultados errados e respostas 200 que, na verdade, deveriam ser 304. Em Se-Faixa Combino as consultas de alcance com um validador: se o ETag ou a data corresponderem, respondo com um 206 Partial Content; caso contrário, envio um 200 com o corpo completo, para que o cliente tenha uma base consistente.
Dominar na perfeição o cabeçalho Vary e a negociação de conteúdo
Sempre que o servidor fornece diferentes representações consoante os requisitos, eu defino Variar correto. Os candidatos típicos são Aceitar codificação (compressão), Aceitar idioma (localização) ou sinalizadores de funcionalidades específicos. Evito recorrer a cabeçalhos voláteis como Agente do utilizador ou mesmo Biscoito variar, porque isso prejudica enormemente a taxa de acertos do cache. Quando a personalização é necessária, marco as respostas como privado ou não armazenar e separá-las claramente dos recursos que podem ser armazenados em cache publicamente. Importante: as variações também afetam os ETags – cada variante precisa do seu próprio validador consistente. Desta forma, garanto que os navegadores, proxies e CDNs apliquem a mesma lógica e que nenhuma variante seja acidentalmente confundida com outra.
Consultas condicionais para além do GET
As solicitações condicionais não funcionam apenas na leitura. Para métodos de gravação, utilizo Se-correspondência ou If-Unmodified-Sincecom o objetivo de atualizações perdidas para evitar. Se, numa operação PUT ou DELETE, o cliente enviar o ETag visto pela última vez através de Se-correspondência se o estado do servidor continuar a ser o mesmo, só aplico a alteração – caso contrário, respondo com 412 Falha na pré-condição. Para disciplinar os clientes, o servidor também pode 428 Pré-requisito necessário implementar. Para testes rápidos sem o corpo, utilizo HEAD, que me fornece os mesmos cabeçalhos que um GET; ideal quando quero testar metadados. E no caso de 304-Nas respostas, reenvio todos os cabeçalhos relevantes para o cache (Cache-Control, ETag, Expires, Last-Modified), para que o cliente atualize os seus metadados sem ter de transferir o corpo da resposta.
Segurança, proteção de dados e conformidade
Não guardo conteúdos pessoais ou sensíveis na cache pública. Aqui, eu Controlo da cache: privado ou não armazenar, para que o navegador, ou melhor, nenhuma instância, armazene o conteúdo. Tenha cuidado com as contas de utilizador e os painéis de controlo: respostas com Definir cookie ou Autorização não devem, por engano, ser armazenáveis em cache publicamente. Os próprios ETags podem ser utilizados indevidamente como vetores de rastreamento se permanecerem estáveis durante um longo período de tempo. Controlo esta situação utilizando validadores apenas onde o armazenamento em cache é intencional e desativando-os em percursos específicos do utilizador ou mantendo o seu tempo de vida curto. Desta forma, concilio o desempenho com os requisitos de proteção de dados.
Detalhes de implementação e custos de desempenho
A criação de um ETag não deve ser mais dispendiosa do que os benefícios que traz. No caso de ficheiros grandes ou renderizações dispendiosas, guardo o tag juntamente com metadados (soma de verificação do ficheiro, hash da compilação, base de dados-versão da linha) e não o recapitulo em cada pedido. No caso de páginas compostas, é útil uma Estratégia de composição de versões: Eu construo o ETag a partir de sub-ETags estáveis (por exemplo, modelo, fragmento de dados, configuração), de modo que pequenas alterações resultem num novo valor específico, mas reproduzível. Em clusters, sincronizo a lógica de geração numa biblioteca comum e verifico-a em CI, para que nenhuma instância se desvie. Para blobs extremamente grandes, recorro a somas de verificação rápidas (CRC64) ou guardo hashes de compilação, em vez de fazer o hash do corpo em tempo real. Onde a igualdade absoluta de bytes não é necessária, basta ETags fracos como um compromisso pragmático.
Erros comuns e como evitá-los
- ETags aleatórios: Se as tags forem geradas de novo a cada pedido, qualquer revalidação perde todo o sentido. Eu garanto valores determinísticos, que só mudam quando há uma alteração real.
- Combinação incorreta das diretivas: não armazenar Usar o ETag não adianta nada – o navegador não guarda de qualquer forma. Eu escolho combinações consistentes para obter o comportamento desejado.
- Vary em excesso: As variações no cookie ou no User-Agent fragmentam a cache. Limito o Vary a alterações reais na representação.
- Armadilhas de compressão: Um ETag comum para gzip e br dá origem a resultados incorretos. Associo os ETags de forma clara à variante específica e defino o Vary corretamente.
- Desvio de hora: Relógios de servidor imprecisos distorcem o campo «Last-Modified». Eu mantenho as fontes de tempo sincronizadas para que o campo «If-Modified-Since» funcione corretamente.
- Confusão com o «no-cache»: Muitos interpretam isso como „não armazenar em cache“. O que se quer dizer é „revalidar sempre“. Para uma proibição efetiva, eu uso não armazenar.
Resolução de problemas, métricas e fluxos de trabalho
Para resolver o problema, começo pela secção «Rede»: está correto Controlo da cache? Ocorre durante a reabilitação 304 em vez de 200? Aceito ETag e Última modificação Entre o pedido e a resposta? Vou verificar Variar, para verificar se as variantes foram identificadas corretamente. Nos registos, eu vejo Acertou/Errou- Apresentar as taxas de 304 e o tamanho médio das respostas por caminho. Quando a taxa de 304 aumenta, o volume de dados e o TTFB costumam diminuir visivelmente. Nos testes de carga, simulo chamadas repetidas para medir os custos de revalidação em vez dos custos de transferência. Em caso de anomalias, elimino gradualmente os fatores de interferência: Set-Cookie, regras Vary excessivamente rígidas, cabeçalhos contraditórios como Pragma. Assim, encontro rapidamente o gargalo que está a pressionar a taxa de acertos.
Service Worker como camada de cache complementar
Se eu utilizar um Service Worker, utilizo-o como uma camada adicional, e não como uma camada contraditória. Deixo que ele faça o mesmo Controlo da cache-Respeita os sinais e combina estratégias como obsoleto-enquanto-revalidado de forma deliberada com validação HTTP através de ETag e Last-Modified. Em casos de funcionamento offline, o worker pode fornecer recursos temporariamente desatualizados e revalidá-los em segundo plano. É importante que ele transmita corretamente os cabeçalhos de condição; caso contrário, perco as vantagens do 304 na ligação de rede. Assim, os cenários PWA também beneficiam de um cache HTTP adequado, em vez de contornarem os seus mecanismos.
Efeito SEO e Core Web Vitals
Melhorar as respostas rápidas UX e sinais dos utilizadores, o que favorece as classificações. Os visitantes recorrentes beneficiam especialmente, porque o seu navegador recupera muitos ficheiros diretamente da cache ou através de respostas 304. Esta menor latência tem um efeito positivo no FCP, LCP e TTFB, que consigo reduzir através de uma revalidação direcionada. Além disso, o servidor poupa tempo de processamento, que posso utilizar para picos de carga ou pedidos complexos. Assim, mantenho o desempenho, enquanto os conteúdos chegam corretamente e em tempo útil.
Resumo: O meu plano de ação
Eu confio numa Combinação A partir de Cache-Control, Last-Modified e ETag. Para recursos estáticos, opto por tempos de validade longos e recorro à revalidação como medida de segurança, caso os ficheiros não tenham versões. Para respostas dinâmicas, gerar ETags robustos e manter os clusters consistentes. Em seguida, verifico com ferramentas, métricas e logs se os códigos 304 ocorrem com frequência suficiente e ajusto as configurações. Assim, garanto uma entrega rápida, menor carga e uma melhor experiência do utilizador através de uma Cache HTTP.


