{"id":20021,"date":"2026-06-15T08:34:43","date_gmt":"2026-06-15T06:34:43","guid":{"rendered":"https:\/\/webhosting.de\/http-conditional-caching-etag-last-modified-performance-guide\/"},"modified":"2026-06-15T08:34:43","modified_gmt":"2026-06-15T06:34:43","slug":"guia-de-desempenho-sobre-cache-condicional-http-etag-e-data-de-ultima-modificacao","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pt\/http-conditional-caching-etag-last-modified-performance-guide\/","title":{"rendered":"Compreender o armazenamento em cache condicional HTTP com ETag e Last-Modified"},"content":{"rendered":"<p>O cache HTTP poupa tempo e dados, pois s\u00f3 recarrega os recursos quando estes realmente mudam. Atrav\u00e9s de <strong>ETag<\/strong> e <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> Verifico, atrav\u00e9s de uma solicita\u00e7\u00e3o condicional, se o servidor responde com um c\u00f3digo 304 Not Modified, o que reduz significativamente a transfer\u00eancia de dados e a carga do servidor.<\/p>\n\n<h2>Pontos centrais<\/h2>\n\n<p>As seguintes ideias-chave mostram o que tenho em mente quando falo de \u00abConditional Caching\u00bb com <strong>ETag<\/strong> e <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> aten\u00e7\u00e3o.<\/p>\n<ul>\n  <li><strong>Menos tr\u00e1fego<\/strong>: Os ficheiros inalterados devolvem um c\u00f3digo de estado 304, em vez de todo o corpo da resposta \u2013 o que reduz significativamente o volume de dados e a lat\u00eancia.<\/li>\n  <li><strong>Melhor desempenho<\/strong>: Tempos de espera mais curtos melhoram a experi\u00eancia do utilizador (UX) e os Core Web Vitals, o que <strong>SEO<\/strong> ajuda.<\/li>\n  <li><strong>Dois mecanismos<\/strong>: Os cabe\u00e7alhos Last-Modified\/If-Modified-Since e ETag\/If-None-Match validam o cache de forma segura.<\/li>\n  <li><strong>Controlo da cache<\/strong>: As diretivas controlam a atualiza\u00e7\u00e3o, a revalida\u00e7\u00e3o e o comportamento nas caches intermedi\u00e1rias.<\/li>\n  <li><strong>Combina\u00e7\u00e3o<\/strong>: Em conjunto, ambos os m\u00e9todos oferecem elevada precis\u00e3o e solu\u00e7\u00f5es alternativas simples.<\/li>\n<\/ul>\n<p>Primeiro, verifico quais os recursos que mudam com frequ\u00eancia e quais os que mudam raramente. Para os ficheiros que raramente s\u00e3o alterados, defino um <strong>\u00daltima modifica\u00e7\u00e3o<\/strong>- e adiciono um ETag. Para respostas din\u00e2micas, prefiro utilizar o <strong>ETag<\/strong>, porque qualquer altera\u00e7\u00e3o no conte\u00fado fica imediatamente vis\u00edvel. Desta forma, alivio a carga nos servidores, reduzo as lat\u00eancias e ofere\u00e7o p\u00e1ginas muito r\u00e1pidas aos visitantes recorrentes. Esta estrat\u00e9gia refor\u00e7a a <strong>Principais dados vitais da Web<\/strong> e, consequentemente, a visibilidade.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/conditional-caching-8923.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Cache condicional HTTP: como verificar a validade<\/h2>\n\n<p>Ao efetuar uma nova solicita\u00e7\u00e3o, o cliente envia, al\u00e9m do m\u00e9todo GET, cabe\u00e7alhos adicionais que eu analiso no lado do servidor. Se o recurso tiver o mesmo <strong>ETag<\/strong> Se corresponder ao conte\u00fado da cache (If-None-Match), envio um 304 Not Modified sem corpo. Se o carimbo de data\/hora n\u00e3o tiver mudado (If-Modified-Since), o servidor responde igualmente com 304. Se o dia ou a data j\u00e1 n\u00e3o estiverem corretos, envio 200 OK com novo conte\u00fado e <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> e ETag. Desta forma, poupo largura de banda, mantenho a cache atualizada e garanto tempos de carregamento visivelmente mais r\u00e1pidos.<\/p>\n\n<h2>Last-Modified e If-Modified-Since no dia a dia<\/h2>\n\n<p>O cabe\u00e7alho <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> Utilizo a data e hora reais da \u00faltima modifica\u00e7\u00e3o do ficheiro, obtidas, por exemplo, do sistema de ficheiros. Se, posteriormente, chegar um pedido com o cabe\u00e7alho \u00abIf-Modified-Since\u00bb e o recurso n\u00e3o tiver sido alterado desde ent\u00e3o, respondo com um c\u00f3digo 304. Esta abordagem \u00e9 simples, f\u00e1cil de compreender e ideal para recursos est\u00e1ticos como CSS, JS ou imagens. As limita\u00e7\u00f5es surgem devido \u00e0 resolu\u00e7\u00e3o de segundos dos carimbos de data\/hora HTTP e em situa\u00e7\u00f5es em que o conte\u00fado muda logicamente sem que exista uma data de arquivo precisa. Onde o Last-Modified atinge os seus limites, um <strong>ETag<\/strong> o controlo.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/meeting_http_caching_4573.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>ETag e If-None-Match em sistemas din\u00e2micos<\/h2>\n\n<p>A <strong>ETag<\/strong> Gero-o como um hash, um ID de vers\u00e3o ou a partir de uma coluna da base de dados que marca as altera\u00e7\u00f5es 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\u00e7\u00e3o deteta qualquer altera\u00e7\u00e3o significativa no conte\u00fado, sem depender dos carimbos de data\/hora dos ficheiros. Especialmente no caso de APIs, p\u00e1ginas compostas ou fragmentos personalizados, isto fornece resultados muito precisos. \u00c9 importante manter os ETags consistentes em ambientes de cluster, para que nenhum servidor utilize acidentalmente um <strong>Dia<\/strong> produzido.<\/p>\n\n<h2>Combinar corretamente o Cache-Control<\/h2>\n\n<p>Com <strong>Controlo da cache<\/strong> Defino por quanto tempo os conte\u00fados s\u00e3o considerados atualizados sem necessidade de verifica\u00e7\u00e3o e quando o navegador deve revalid\u00e1-los. Defino valores adequados para o atributo `max-age` de acordo com a frequ\u00eancia de altera\u00e7\u00f5es e utilizo `must-revalidate` quando dados desatualizados poderiam ser cr\u00edticos. Para ficheiros versionados, \u00e9 adequada uma validade longa, enquanto respostas que mudam frequentemente t\u00eam uma validade mais curta e podem ser verificadas de forma clara atrav\u00e9s do ETag ou da data. Assim, combino tempos de resposta curtos com atualidade correta. Quem quiser aprofundar o assunto encontrar\u00e1 muitos exemplos em <a href=\"https:\/\/webhosting.de\/pt\/http-cache-control-strategies-hosting-cachemaster\/\">Estrat\u00e9gias de Cache-Control<\/a>, que utilizo na pr\u00e1tica.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/http-caching-etag-concept-3892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Processo de uma solicita\u00e7\u00e3o GET condicional, passo a passo<\/h2>\n\n<p>Na primeira solicita\u00e7\u00e3o, o servidor envia um 200 OK com Cache-Control, <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> e ETag, o navegador guarda tudo. Na visita seguinte, a data de validade no cache determina se \u00e9 necess\u00e1ria uma revalida\u00e7\u00e3o. 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\u00e1 n\u00e3o corresponderem, segue-se um 200 OK com um novo corpo e atualizado <strong>Dados de valida\u00e7\u00e3o<\/strong>.<\/p>\n\n<h2>Compara\u00e7\u00e3o: ETag vs. Last-Modified<\/h2>\n\n<p>Ambos os m\u00e9todos garantem-me controlo, mas diferem em termos de esfor\u00e7o, precis\u00e3o e adequa\u00e7\u00e3o. <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> destaca-se pela facilidade de implementa\u00e7\u00e3o e pela sem\u00e2ntica clara, desde que eu tenha carimbos de data\/hora precisos. O ETag reflete o conte\u00fado com grande precis\u00e3o, mas requer alguma l\u00f3gica para ser gerado. Em muitas configura\u00e7\u00f5es, combino ambos e beneficio assim da simplicidade e do reconhecimento exato. A tabela seguinte resume as caracter\u00edsticas t\u00edpicas e ajuda na tomada de decis\u00e3o.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Aspeto<\/strong><\/th>\n      <th><strong>\u00daltima modifica\u00e7\u00e3o<\/strong><\/th>\n      <th><strong>ETag<\/strong><\/th>\n      <th><strong>Nota<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Identidade<\/td>\n      <td>Data e hora da \u00faltima altera\u00e7\u00e3o<\/td>\n      <td>Hash do conte\u00fado ou ID da vers\u00e3o<\/td>\n      <td><strong>Tempo<\/strong> vs. identificador baseado no conte\u00fado<\/td>\n    <\/tr>\n    <tr>\n      <td>Detec\u00e7\u00e3o de altera\u00e7\u00f5es<\/td>\n      <td>Resolu\u00e7\u00e3o em segundos, indireta<\/td>\n      <td>Totalmente orientado para o conte\u00fado<\/td>\n      <td>O ETag deteta os mais pequenos <strong>Diferen\u00e7as<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>implementa\u00e7\u00e3o<\/td>\n      <td>Muito leve, o sistema de ficheiros \u00e9 suficiente<\/td>\n      <td>Exige gera\u00e7\u00e3o e consist\u00eancia<\/td>\n      <td>Os clusters precisam de igualdade <strong>ETags<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>Utiliza\u00e7\u00e3o<\/td>\n      <td>Recursos est\u00e1ticos<\/td>\n      <td>Respostas din\u00e2micas<\/td>\n      <td>Esta combina\u00e7\u00e3o abrange muitos <strong>Casos<\/strong> de<\/td>\n    <\/tr>\n    <tr>\n      <td>Respostas<\/td>\n      <td>304 com carimbo de data\/hora inalterado<\/td>\n      <td>304 com data id\u00eantica<\/td>\n      <td>200 em caso de altera\u00e7\u00f5es com novo <strong>Valor<\/strong><\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/tech_office_caching_4721.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Na pr\u00e1tica: distribuir recursos est\u00e1ticos de forma eficiente<\/h2>\n\n<p>Os ficheiros est\u00e1ticos, como CSS, JS e imagens, raramente s\u00e3o alterados e s\u00e3o adequados para <strong>idade m\u00e1xima<\/strong>-Tempos. Para ficheiros versionados, defino valores elevados, at\u00e9 um ano, e marco-os como imut\u00e1veis, para que o navegador os carregue sem solicitar confirma\u00e7\u00e3o. Para recursos sem vers\u00e3o, escolho prazos mais curtos e confio na revalida\u00e7\u00e3o atrav\u00e9s do ETag e do Last-Modified. Assim, evito conte\u00fados desatualizados e mantenho o tr\u00e1fego baixo. Se tiver o cuidado de n\u00e3o <a href=\"https:\/\/webhosting.de\/pt\/http-cache-headers-sabotam-o-cache-cachefix\/\">Cabe\u00e7alho da cache de sabotagem<\/a> Ao deixar isso assim, consigo uma elevada taxa de acertos na cache.<\/p>\n\n<h2>Na pr\u00e1tica: APIs e p\u00e1ginas din\u00e2micas<\/h2>\n\n<p>No que diz respeito \u00e0s APIs, costumo optar por <strong>ETags<\/strong>, que crio a partir do resultado serializado ou de uma coluna de vers\u00e3o. Se o registo for alterado, gerio uma nova data, e os clientes reconhecem isso imediatamente. Para conte\u00fados com carimbos de data\/hora incertos, muitas vezes dispenso o Last-Modified, para que n\u00e3o se crie uma falsa impress\u00e3o de atualidade. Al\u00e9m disso, controlo o tempo de vida atrav\u00e9s do Cache-Control e for\u00e7o a revalida\u00e7\u00e3o ap\u00f3s o prazo de validade. Assim, mantenho os dados atualizados de forma fi\u00e1vel, sem tornar as respostas desnecessariamente grandes.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/developer_desk_caching_3947.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Testes e monitoriza\u00e7\u00e3o da taxa de acertos do cache<\/h2>\n\n<p>Verifico cabe\u00e7alhos como <strong>ETag<\/strong>, Last-Modified, If-None-Match e If-Modified-Since nas Ferramentas do Desenvolvedor. Ao faz\u00ea-lo, presto aten\u00e7\u00e3o aos c\u00f3digos de resposta, especialmente 304 vs. 200, para verificar a efic\u00e1cia da minha revalida\u00e7\u00e3o. Se o 304 for raro, ajusto o Cache-Control, os per\u00edodos de validade e a gera\u00e7\u00e3o do ETag. Os logs e as m\u00e9tricas mostram-me quais os caminhos que respondem com respostas desnecessariamente grandes. Para melhorias agrupadas, gosto de utilizar um <a href=\"https:\/\/webhosting.de\/pt\/pacote-de-otimizacao-da-validacao-da-cache-de-pedidos-condicionais-http\/\">Pacote de Pedidos Condicionais<\/a>, que combina a configura\u00e7\u00e3o e os testes.<\/p>\n\n<h2>Arquitetura de alojamento e armadilhas do ETag<\/h2>\n\n<p>Em configura\u00e7\u00f5es com v\u00e1rios servidores, \u00e9 necess\u00e1rio um <strong>ETag<\/strong> ser independente da inst\u00e2ncia, caso contr\u00e1rio, o reconhecimento falha. Asseguro-me de que todos os n\u00f3s utilizam a mesma l\u00f3gica e a mesma chave para a gera\u00e7\u00e3o. Os proxies reversos ou as CDNs n\u00e3o devem alterar os ETags e devem reenviar corretamente os cabe\u00e7alhos de condi\u00e7\u00e3o. Em implementa\u00e7\u00f5es com impress\u00f5es digitais de ativos, evito o rec\u00e1lculo de ETags do lado do servidor se o ficheiro j\u00e1 tiver uma URL versionada. Regras uniformes evitam respostas inconsistentes e mant\u00eam a taxa de acertos do cache elevada.<\/p>\n\n<h2>Atualiza\u00e7\u00e3o vs. valida\u00e7\u00e3o: utilizar as diretivas com precis\u00e3o<\/h2>\n\n<p>Fa\u00e7o uma distin\u00e7\u00e3o clara entre <em>Frescura<\/em> (por quanto tempo um cache pode utilizar uma c\u00f3pia sem consultar o servidor?) e <em>Valida\u00e7\u00e3o<\/em> (como posso verificar se ainda \u00e9 v\u00e1lida?). Sobre <strong>Controlo da cache<\/strong> controlo ambos com grande precis\u00e3o: <strong>idade m\u00e1xima<\/strong> define o tempo de vida no cliente, <strong>s-maxagem<\/strong> para caches partilhadas, como proxies. <strong>p\u00fablico<\/strong> permite o armazenamento em cache em caches partilhadas, <strong>privado<\/strong> limita-o ao navegador final. <strong>deve revalidar<\/strong> obriga a realizar consultas ap\u00f3s o t\u00e9rmino, enquanto <strong>imut\u00e1vel<\/strong> evita revalida\u00e7\u00f5es desnecess\u00e1rias no caso de recursos com vers\u00f5es. <strong>sem cache<\/strong> n\u00e3o pro\u00edbe o armazenamento em cache, mas exige sempre uma revalida\u00e7\u00e3o; <strong>n\u00e3o armazenar<\/strong> por outro lado, pro\u00edbe totalmente o armazenamento. Vers\u00f5es mais antigas <strong>Expira\u00e7\u00f5es<\/strong>- Utilizo o cabe\u00e7alho apenas como alternativa; transfiro sistematicamente a l\u00f3gica para o Cache-Control. E quando quero atenuar eventuais falhas, isso ajuda <strong>obsoleto-enquanto-revalidado<\/strong> e <strong>estagna\u00e7\u00e3o em caso de erro<\/strong>, para partilhar conte\u00fados que expiram a curto prazo, enquanto atualizo em segundo plano ou contornou erros.<\/p>\n\n<h2>ETags fortes e fracas, compress\u00e3o e variantes<\/h2>\n\n<p>Distingo deliberadamente entre validadores fortes e fracos. <strong>ETags fortes<\/strong> identificar a representa\u00e7\u00e3o exatamente igual, byte a byte \u2013 ideal se eu tamb\u00e9m <strong>Pedidos de alcance<\/strong> deseja utilizar de forma eficiente. <strong>ETags fracos<\/strong> (Prefixo <code>W\/<\/code>) s\u00e3o suficientes quando basta a equival\u00eancia sem\u00e2ntica, por exemplo, no caso de pequenas altera\u00e7\u00f5es de formata\u00e7\u00e3o irrelevantes. O importante \u00e9 a forma como se lida com <strong>Compress\u00e3o<\/strong>: Se eu fornecer conte\u00fados codificados tanto em gzip como em Brotli, um \u00fanico ETag n\u00e3o pode ser v\u00e1lido para todas as variantes. Ou calculo o ETag com base na representa\u00e7\u00e3o n\u00e3o comprimida e defino adicionalmente um <strong>Vary: Aceitar-Codifica\u00e7\u00e3o<\/strong>, ou ent\u00e3o gerio ETags consistentes, mas diferentes, para cada variante. Desta forma, evito resultados errados e respostas 200 que, na verdade, deveriam ser 304. Em <strong>Se-Faixa<\/strong> Combino as consultas de alcance com um validador: se o ETag ou a data corresponderem, respondo com um 206 Partial Content; caso contr\u00e1rio, envio um 200 com o corpo completo, para que o cliente tenha uma base consistente.<\/p>\n\n<h2>Dominar na perfei\u00e7\u00e3o o cabe\u00e7alho Vary e a negocia\u00e7\u00e3o de conte\u00fado<\/h2>\n\n<p>Sempre que o servidor fornece diferentes representa\u00e7\u00f5es consoante os requisitos, eu defino <strong>Variar<\/strong> correto. Os candidatos t\u00edpicos s\u00e3o <strong>Aceitar codifica\u00e7\u00e3o<\/strong> (compress\u00e3o), <strong>Aceitar idioma<\/strong> (localiza\u00e7\u00e3o) ou sinalizadores de funcionalidades espec\u00edficos. Evito recorrer a cabe\u00e7alhos vol\u00e1teis como <strong>Agente do utilizador<\/strong> ou mesmo <strong>Biscoito<\/strong> variar, porque isso prejudica enormemente a taxa de acertos do cache. Quando a personaliza\u00e7\u00e3o \u00e9 necess\u00e1ria, marco as respostas como <strong>privado<\/strong> ou <strong>n\u00e3o armazenar<\/strong> e separ\u00e1-las claramente dos recursos que podem ser armazenados em cache publicamente. Importante: as varia\u00e7\u00f5es tamb\u00e9m afetam os ETags \u2013 cada variante precisa do seu pr\u00f3prio validador consistente. Desta forma, garanto que os navegadores, proxies e CDNs apliquem a mesma l\u00f3gica e que nenhuma variante seja acidentalmente confundida com outra.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/httpcaching-verstehen-2638.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Consultas condicionais para al\u00e9m do GET<\/h2>\n\n<p>As solicita\u00e7\u00f5es condicionais n\u00e3o funcionam apenas na leitura. Para m\u00e9todos de grava\u00e7\u00e3o, utilizo <strong>Se-correspond\u00eancia<\/strong> ou <strong>If-Unmodified-Since<\/strong>com o objetivo de <em>atualiza\u00e7\u00f5es perdidas<\/em> para evitar. Se, numa opera\u00e7\u00e3o PUT ou DELETE, o cliente enviar o ETag visto pela \u00faltima vez atrav\u00e9s de <strong>Se-correspond\u00eancia<\/strong> se o estado do servidor continuar a ser o mesmo, s\u00f3 aplico a altera\u00e7\u00e3o \u2013 caso contr\u00e1rio, respondo com <strong>412 Falha na pr\u00e9-condi\u00e7\u00e3o<\/strong>. Para disciplinar os clientes, o servidor tamb\u00e9m pode <strong>428 Pr\u00e9-requisito necess\u00e1rio<\/strong> implementar. Para testes r\u00e1pidos sem o corpo, utilizo <strong>HEAD<\/strong>, que me fornece os mesmos cabe\u00e7alhos que um GET; ideal quando quero testar metadados. E no caso de <strong>304<\/strong>-Nas respostas, reenvio todos os cabe\u00e7alhos 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.<\/p>\n\n<h2>Seguran\u00e7a, prote\u00e7\u00e3o de dados e conformidade<\/h2>\n\n<p>N\u00e3o guardo conte\u00fados pessoais ou sens\u00edveis na cache p\u00fablica. Aqui, eu <strong>Controlo da cache: privado<\/strong> ou <strong>n\u00e3o armazenar<\/strong>, para que o navegador, ou melhor, nenhuma inst\u00e2ncia, armazene o conte\u00fado. Tenha cuidado com as contas de utilizador e os pain\u00e9is de controlo: respostas com <strong>Definir cookie<\/strong> ou <strong>Autoriza\u00e7\u00e3o<\/strong> n\u00e3o devem, por engano, ser armazen\u00e1veis em cache publicamente. Os pr\u00f3prios ETags podem ser utilizados indevidamente como vetores de rastreamento se permanecerem est\u00e1veis durante um longo per\u00edodo de tempo. Controlo esta situa\u00e7\u00e3o utilizando validadores apenas onde o armazenamento em cache \u00e9 intencional e desativando-os em percursos espec\u00edficos do utilizador ou mantendo o seu tempo de vida curto. Desta forma, concilio o desempenho com os requisitos de prote\u00e7\u00e3o de dados.<\/p>\n\n<h2>Detalhes de implementa\u00e7\u00e3o e custos de desempenho<\/h2>\n\n<p>A cria\u00e7\u00e3o de um ETag n\u00e3o deve ser mais dispendiosa do que os benef\u00edcios que traz. No caso de ficheiros grandes ou renderiza\u00e7\u00f5es dispendiosas, guardo o tag juntamente com metadados (soma de verifica\u00e7\u00e3o do ficheiro, hash da compila\u00e7\u00e3o, base de dados-<em>vers\u00e3o da linha<\/em>) e n\u00e3o o recapitulo em cada pedido. No caso de p\u00e1ginas compostas, \u00e9 \u00fatil uma <em>Estrat\u00e9gia de composi\u00e7\u00e3o de vers\u00f5es<\/em>: Eu construo o ETag a partir de sub-ETags est\u00e1veis (por exemplo, modelo, fragmento de dados, configura\u00e7\u00e3o), de modo que pequenas altera\u00e7\u00f5es resultem num novo valor espec\u00edfico, mas reproduz\u00edvel. Em clusters, sincronizo a l\u00f3gica de gera\u00e7\u00e3o numa biblioteca comum e verifico-a em CI, para que nenhuma inst\u00e2ncia se desvie. Para blobs extremamente grandes, recorro a somas de verifica\u00e7\u00e3o r\u00e1pidas (CRC64) ou guardo hashes de compila\u00e7\u00e3o, em vez de fazer o hash do corpo em tempo real. Onde a igualdade absoluta de bytes n\u00e3o \u00e9 necess\u00e1ria, basta <strong>ETags fracos<\/strong> como um compromisso pragm\u00e1tico.<\/p>\n\n<h2>Erros comuns e como evit\u00e1-los<\/h2>\n\n<ul>\n  <li><strong>ETags aleat\u00f3rios<\/strong>: Se as tags forem geradas de novo a cada pedido, qualquer revalida\u00e7\u00e3o perde todo o sentido. Eu garanto valores determin\u00edsticos, que s\u00f3 mudam quando h\u00e1 uma altera\u00e7\u00e3o real.<\/li>\n  <li><strong>Combina\u00e7\u00e3o incorreta das diretivas<\/strong>: <em>n\u00e3o armazenar<\/em> Usar o ETag n\u00e3o adianta nada \u2013 o navegador n\u00e3o guarda de qualquer forma. Eu escolho combina\u00e7\u00f5es consistentes para obter o comportamento desejado.<\/li>\n  <li><strong>Vary em excesso<\/strong>: As varia\u00e7\u00f5es no cookie ou no User-Agent fragmentam a cache. Limito o Vary a altera\u00e7\u00f5es reais na representa\u00e7\u00e3o.<\/li>\n  <li><strong>Armadilhas de compress\u00e3o<\/strong>: Um ETag comum para gzip e br d\u00e1 origem a resultados incorretos. Associo os ETags de forma clara \u00e0 variante espec\u00edfica e defino o Vary corretamente.<\/li>\n  <li><strong>Desvio de hora<\/strong>: Rel\u00f3gios de servidor imprecisos distorcem o campo \u00abLast-Modified\u00bb. Eu mantenho as fontes de tempo sincronizadas para que o campo \u00abIf-Modified-Since\u00bb funcione corretamente.<\/li>\n  <li><strong>Confus\u00e3o com o \u00abno-cache\u00bb<\/strong>: Muitos interpretam isso como \u201en\u00e3o armazenar em cache\u201c. O que se quer dizer \u00e9 \u201erevalidar sempre\u201c. Para uma proibi\u00e7\u00e3o efetiva, eu uso <em>n\u00e3o armazenar<\/em>.<\/li>\n<\/ul>\n\n<h2>Resolu\u00e7\u00e3o de problemas, m\u00e9tricas e fluxos de trabalho<\/h2>\n\n<p>Para resolver o problema, come\u00e7o pela sec\u00e7\u00e3o \u00abRede\u00bb: est\u00e1 correto <strong>Controlo da cache<\/strong>? Ocorre durante a reabilita\u00e7\u00e3o <strong>304<\/strong> em vez de 200? Aceito <strong>ETag<\/strong> e <strong>\u00daltima modifica\u00e7\u00e3o<\/strong> Entre o pedido e a resposta? Vou verificar <strong>Variar<\/strong>, para verificar se as variantes foram identificadas corretamente. Nos registos, eu vejo <em>Acertou\/Errou<\/em>- Apresentar as taxas de 304 e o tamanho m\u00e9dio 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\u00e7\u00e3o em vez dos custos de transfer\u00eancia. Em caso de anomalias, elimino gradualmente os fatores de interfer\u00eancia: Set-Cookie, regras Vary excessivamente r\u00edgidas, cabe\u00e7alhos contradit\u00f3rios como Pragma. Assim, encontro rapidamente o gargalo que est\u00e1 a pressionar a taxa de acertos.<\/p>\n\n<h2>Service Worker como camada de cache complementar<\/h2>\n\n<p>Se eu utilizar um Service Worker, utilizo-o como uma camada adicional, e n\u00e3o como uma camada contradit\u00f3ria. Deixo que ele fa\u00e7a o mesmo <strong>Controlo da cache<\/strong>-Respeita os sinais e combina estrat\u00e9gias como <em>obsoleto-enquanto-revalidado<\/em> de forma deliberada com valida\u00e7\u00e3o HTTP atrav\u00e9s de ETag e Last-Modified. Em casos de funcionamento offline, o worker pode fornecer recursos temporariamente desatualizados e revalid\u00e1-los em segundo plano. \u00c9 importante que ele transmita corretamente os cabe\u00e7alhos de condi\u00e7\u00e3o; caso contr\u00e1rio, perco as vantagens do 304 na liga\u00e7\u00e3o de rede. Assim, os cen\u00e1rios PWA tamb\u00e9m beneficiam de um cache HTTP adequado, em vez de contornarem os seus mecanismos.<\/p>\n\n<h2>Efeito SEO e Core Web Vitals<\/h2>\n\n<p>Melhorar as respostas r\u00e1pidas <strong>UX<\/strong> e sinais dos utilizadores, o que favorece as classifica\u00e7\u00f5es. Os visitantes recorrentes beneficiam especialmente, porque o seu navegador recupera muitos ficheiros diretamente da cache ou atrav\u00e9s de respostas 304. Esta menor lat\u00eancia tem um efeito positivo no FCP, LCP e TTFB, que consigo reduzir atrav\u00e9s de uma revalida\u00e7\u00e3o direcionada. Al\u00e9m disso, o servidor poupa tempo de processamento, que posso utilizar para picos de carga ou pedidos complexos. Assim, mantenho o desempenho, enquanto os conte\u00fados chegam corretamente e em tempo \u00fatil.<\/p>\n\n<h2>Resumo: O meu plano de a\u00e7\u00e3o<\/h2>\n\n<p>Eu confio numa <strong>Combina\u00e7\u00e3o<\/strong> A partir de Cache-Control, Last-Modified e ETag. Para recursos est\u00e1ticos, opto por tempos de validade longos e recorro \u00e0 revalida\u00e7\u00e3o como medida de seguran\u00e7a, caso os ficheiros n\u00e3o tenham vers\u00f5es. Para respostas din\u00e2micas, gerar ETags robustos e manter os clusters consistentes. Em seguida, verifico com ferramentas, m\u00e9tricas e logs se os c\u00f3digos 304 ocorrem com frequ\u00eancia suficiente e ajusto as configura\u00e7\u00f5es. Assim, garanto uma entrega r\u00e1pida, menor carga e uma melhor experi\u00eancia do utilizador atrav\u00e9s de uma <strong>Cache HTTP<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Aprenda como funciona o cache condicional HTTP com ETag e Last-Modified, como se implementa a valida\u00e7\u00e3o do cache do navegador e como pode otimizar os tempos de carregamento, a largura de banda e a carga do servidor.<\/p>","protected":false},"author":1,"featured_media":20014,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[834],"tags":[],"class_list":["post-20021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk-webserver-plesk-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"129","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"HTTP Caching","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20014","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/20021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/comments?post=20021"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/20021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media\/20014"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media?parent=20021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/categories?post=20021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/tags?post=20021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}