{"id":17058,"date":"2026-01-27T08:37:12","date_gmt":"2026-01-27T07:37:12","guid":{"rendered":"https:\/\/webhosting.de\/wordpress-browser-caching-fehler-serverboost\/"},"modified":"2026-01-27T08:37:12","modified_gmt":"2026-01-27T07:37:12","slug":"wordpress-browser-caching-error-serverboost","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pt\/wordpress-browser-caching-fehler-serverboost\/","title":{"rendered":"Cache do WordPress e do navegador - muitas vezes configurado incorretamente"},"content":{"rendered":"<p>O cache do navegador do WordPress muitas vezes causa respostas lentas, porque os operadores t\u00eam que <strong>Cabe\u00e7alho da cache<\/strong> definidas incorretamente ou n\u00e3o controladas de todo. Vou mostrar-lhe como as configura\u00e7\u00f5es incorrectas t\u00edpicas devolvem 200 em vez de 304, porque \u00e9 que os TTLs est\u00e3o em falta e como posso configurar corretamente a cache no WordPress. <strong>Desempenho<\/strong> guarni\u00e7\u00e3o.<\/p>\n\n<h2>Pontos centrais<\/h2>\n\n<ul>\n  <li><strong>TTL longo<\/strong> para activos est\u00e1ticos evita pedidos desnecess\u00e1rios.<\/li>\n  <li><strong>Separa\u00e7\u00e3o clara<\/strong> de caminhos est\u00e1ticos e din\u00e2micos protege o admin e o login.<\/li>\n  <li><strong>Um sistema<\/strong> n\u00e3o misture plug-ins de cache concorrentes.<\/li>\n  <li><strong>Verificar os cabe\u00e7alhos<\/strong> com DevTools e estado 304.<\/li>\n  <li><strong>Armazenamento em cache no servidor<\/strong> e a cache do browser.<\/li>\n<\/ul>\n\n<h2>Como funciona realmente a cache do navegador no WordPress<\/h2>\n\n<p>O browser armazena ficheiros est\u00e1ticos localmente, poupando assim a necessidade de os recarregar. <strong>Pedidos HTTP<\/strong>. Na segunda visita, l\u00ea imagens, CSS e JS da mem\u00f3ria local e s\u00f3 pede altera\u00e7\u00f5es ao servidor. Isto reduz a quantidade de dados, os tempos de resposta s\u00e3o reduzidos e a desloca\u00e7\u00e3o parece imediatamente mais reactiva. <strong>l\u00edquido<\/strong> sobre. Se n\u00e3o houver instru\u00e7\u00f5es claras, o browser recarrega-se completamente de cada vez e o tempo de intera\u00e7\u00e3o \u00e9 prejudicado. Os cabe\u00e7alhos de controlo de cache corretamente definidos permitem valida\u00e7\u00f5es 304, reduzem a largura de banda e reduzem a carga no PHP e na base de dados. Utilizo-o sistematicamente porque os utilizadores recorrentes, em particular, s\u00e3o os que mais beneficiam da cache persistente.<\/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\/01\/wordpress-caching-problem-8392.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Porque \u00e9 que a configura\u00e7\u00e3o falha frequentemente<\/h2>\n\n<p>Muitos s\u00edtios fornecem ficheiros est\u00e1ticos com <strong>idade m\u00e1xima<\/strong>-valores. Alguns plugins sobrescrevem os .htaccess uns dos outros e definem diretivas contradit\u00f3rias. Muitas vezes, o site marca incorretamente os caminhos de administra\u00e7\u00e3o, fazendo com que o conte\u00fado de \/wp-admin ou \/wp-login.php acabe na cache de forma n\u00e3o intencional e as sess\u00f5es colidam. Tamb\u00e9m verifico a diferen\u00e7a entre a primeira chamada e a chamada recorrente, uma vez que isto explica claramente as experi\u00eancias reais dos utilizadores; a compara\u00e7\u00e3o enquadra-se no seguinte <a href=\"https:\/\/webhosting.de\/pt\/wordpress-caching-comparacao-primeira-chamada-velocidade-lenta\/\">Primeira chamada vs. chamada de retorno<\/a>. Se continuar a utilizar cadeias de caracteres de consulta sem controlo de vers\u00e3o, criar\u00e1 ficheiros antigos na mem\u00f3ria e questionar-se-\u00e1 sobre <strong>obsoleto<\/strong> Estilos.<\/p>\n\n<h2>Definir corretamente os cabe\u00e7alhos da cache do WP<\/h2>\n\n<p>Controlo a dura\u00e7\u00e3o com <strong>Controlo da cache<\/strong> e Expires, e evito ETags amb\u00edguas em ambientes multi-servidor. Para o Apache, defino Expires para valores significativos e defino \u201epublic, max-age\u201c para os activos. Para o Nginx, adiciono diretivas add_header e certifico-me de que o HTML tem tempos curtos ou \u201eno-store\u201c se o conte\u00fado for personalizado. Tamb\u00e9m desativo os cabe\u00e7alhos ETag se os balanceadores de carga ou proxies n\u00e3o gerarem esses valores de forma consistente. Desta forma, imponho um comportamento claro no browser e evito <strong>Revalida\u00e7\u00f5es<\/strong> com cada clique.<\/p>\n\n<pre><code>ExpiresActive On\n  ExpiresByType image\/jpeg \"acesso mais 1 ano\"\n  ExpiresByType image\/png \"acesso mais 1 ano\"\n  ExpiresByType text\/css \"acesso mais 1 m\u00eas\"\n  ExpiresByType application\/javascript \"acesso mais 1 m\u00eas\"\n\n\n\n  Header set Cache-Control \"public, max-age=31536000\" \"expr=%{CONTENT_TYPE} =~ m#^(image\/|font\/|application\/javascript)#\"\n  Header set Cache-Control \"no-cache, no-store, must-revalidate\" \"expr=%{REQUEST_URI} =~ m#(wp-admin|wp-login.php)#\"\n  Cabe\u00e7alho ETag n\u00e3o definido<\/code><\/pre>\n\n<pre><code># Nginx\nlocaliza\u00e7\u00e3o ~* .(jpg|jpeg|png|gif|ico|webp|avif|css|js|woff2?)$ {\n    add_header Cache-Control \"public, max-age=31536000\";\n}\nlocaliza\u00e7\u00e3o ~* \/(wp-admin|wp-login.php)$ {\n    add_header Cache-Control \"no-store\";\n}<\/code><\/pre>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/01\/wordpress_caching_meeting_5823.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Diretivas de controlo de cache alargadas na vida quotidiana<\/h2>\n\n<p>Para al\u00e9m de \u201emax-age\u201c e \u201eno-store\u201c, as diretivas modernas garantem uma estabilidade not\u00e1vel. \u201eimmutable\u201c indica ao navegador que um ficheiro n\u00e3o ser\u00e1 alterado enquanto o nome do ficheiro permanecer o mesmo - ideal para activos com vers\u00f5es. \u201estale-while-revalidate\u201c permite que uma c\u00f3pia expirada seja entregue enquanto \u00e9 actualizada em segundo plano. \u201estale-if-error\u201c mant\u00e9m uma c\u00f3pia pronta se a Origem devolver brevemente erros. \u201es-maxage\u201c destina-se a proxies\/CDNs e pode ter valores diferentes de \u201emax-age\u201c. Tamb\u00e9m importante: \u201epublic\u201c permite o armazenamento em cache em proxies partilhados; \u201eprivate\u201c \u00e9 restrito ao browser. \u201eno-cache\u201c n\u00e3o significa \u201en\u00e3o armazenar em cache\u201c, mas sim \u201e\u00e9 permitido armazenar em cache, mas revalidar antes de utilizar\u201c - uma diferen\u00e7a crucial em rela\u00e7\u00e3o a \u201eno-store\u201c.<\/p>\n\n<pre><code># Exemplo do Apache 2.4 (cache de activos ainda mais robusto)\n\n  Header set Cache-Control \"public, max-age=31536000, immutable, stale-while-revalidate=86400, stale-if-error=259200\" \"expr=%{REQUEST_URI} =~ m#.(css|js|woff2?|png|jpe?g|webp|avif)$#\"\n  Header set Cache-Control \"no-cache, must-revalidate\" \"expr=%{CONTENT_TYPE} =~ m#^text\/html#\"<\/code><\/pre>\n\n<pre><code># Exemplo Nginx (redireccionamentos 304\/Include)\nlocation ~* .(css|js|woff2?|png|jpe?g|webp|avif)$ {\n    add_header Cache-Control \"public, max-age=31536000, immutable, stale-while-revalidate=86400, stale-if-error=259200\" always;\n}\nlocaliza\u00e7\u00e3o ~* .html$ {\n    add_header Cache-Control \"no-cache, must-revalidate\" always;\n}<\/code><\/pre>\n\n<h2>Dura\u00e7\u00f5es de cache recomendadas por tipo de ficheiro<\/h2>\n\n<p>Escolho os hor\u00e1rios de acordo com a frequ\u00eancia das mudan\u00e7as, n\u00e3o com o h\u00e1bito, porque <strong>Activos<\/strong> envelhecem de forma muito diferente. As imagens, os log\u00f3tipos e os \u00edcones mant\u00eam-se normalmente actualizados durante muito tempo, enquanto as CSS\/JS recebem itera\u00e7\u00f5es mais frequentes. Os tipos de letra da Web raramente mudam, mas exigem cabe\u00e7alhos CORS consistentes. O HTML serve frequentemente de contentor para conte\u00fados din\u00e2micos e pode, por isso, ser curto ou apenas revalidado. As APIs devem ter regras claramente definidas para que os clientes possam trabalhar corretamente com <strong>JSON<\/strong> evitar.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Tipo de ficheiro<\/th>\n      <th>Recomenda\u00e7\u00e3o de controlo da cache<\/th>\n      <th>Nota<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Imagens (jpg\/png\/webp\/avif\/svg)<\/td>\n      <td>public, max-age=31536000<\/td>\n      <td>Utilizar a cache anual com o controlo de vers\u00f5es de ficheiros<\/td>\n    <\/tr>\n    <tr>\n      <td>CSS\/JS<\/td>\n      <td>p\u00fablico, max-age=2592000<\/td>\n      <td>Anexar a vers\u00e3o ao nome do ficheiro para actualiza\u00e7\u00f5es<\/td>\n    <\/tr>\n    <tr>\n      <td>Tipos de letra (woff\/woff2)<\/td>\n      <td>public, max-age=31536000<\/td>\n      <td>Definir corretamente Access-Control-Allow-Origin<\/td>\n    <\/tr>\n    <tr>\n      <td>HTML (p\u00e1ginas)<\/td>\n      <td>no-cache, must-revalidate ou short max-age<\/td>\n      <td>Muito cuidado com os conte\u00fados din\u00e2micos<\/td>\n    <\/tr>\n    <tr>\n      <td>API REST (json)<\/td>\n      <td>private, max-age=0, must-revalidate<\/td>\n      <td>Diferenciar de acordo com o par\u00e2metro<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>Evitar conflitos com plugins<\/h2>\n\n<p>Utilizo no m\u00e1ximo <strong>Plugin de cache<\/strong> e verificar se o alojamento j\u00e1 especifica regras a n\u00edvel do servidor. Combina\u00e7\u00f5es como o W3 Total Cache e o WP Super Cache criam frequentemente diretivas duplicadas que se anulam mutuamente. O WP Rocket oferece uma configura\u00e7\u00e3o r\u00e1pida, mas precisa de exclus\u00f5es claras para caminhos din\u00e2micos e com\u00e9rcio eletr\u00f3nico. Em qualquer caso, verifico o .htaccess gerado depois de o guardar para reconhecer cabe\u00e7alhos il\u00f3gicos. Em seguida, testo p\u00e1ginas cr\u00edticas, como checkout, login e pain\u00e9is personalizados, para verificar se est\u00e3o corretas <strong>Contornar<\/strong>.<\/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\/01\/wordpress-browser-caching-fehler-9274.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Caching e cookies: utilizadores com sess\u00e3o iniciada, WooCommerce, sess\u00f5es<\/h2>\n\n<p>O HTML para utilizadores com sess\u00e3o iniciada n\u00e3o deve ser armazenado na cache p\u00fablica. O WordPress define cookies como <code>wordpress_logged_in_<\/code>, WooCommerce complementado <code>woocommerce_items_in_cart<\/code>, <code>wp_woocommerce_session_<\/code> e outros. Em vez do excesso de <em>Vary: Cookie<\/em> Ignoro completamente as caches para estes pedidos. Isto mant\u00e9m os processos de checkout est\u00e1veis e as \u00e1reas personalizadas corretas. Tamb\u00e9m utilizo regras do lado do servidor que definem cabe\u00e7alhos mais restritivos quando os cookies s\u00e3o reconhecidos.<\/p>\n\n<pre><code># Apache: Reconhecendo cookies e definindo cabe\u00e7alhos de desvio\n\n  SetEnvIfNoCase Cookie \"wordpress_logged_in_|woocommerce_items_in_cart|wp_woocommerce_session\" has_session\n  Header set Cache-Control \"private, no-store\" env=has_session<\/code><\/pre>\n\n<pre><code># Nginx: desvio baseado em cookies\nif ($http_cookie ~* \"(wordpress_logged_in|woocommerce_items_in_cart|wp_woocommerce_session)\") {\n    add_header Cache-Control \"private, no-store\" always;\n}<\/code><\/pre>\n\n<p>Muitos plug-ins de cache oferecem caixas de sele\u00e7\u00e3o para isso (WooCommerce\/Cart\/Excluir checkout). Importante: Nonces (<code>_wpnonce<\/code>) nos formul\u00e1rios e a API Heartbeat geram altera\u00e7\u00f5es frequentes. Certifico-me de que o HTML de frontend com nonces n\u00e3o \u00e9 permanentemente armazenado em cache ou funciona atrav\u00e9s de \u201eno-cache, must-revalidate\u201c.<\/p>\n\n<h2>Tratamento direcionado da HTML: personalizado vs. geral<\/h2>\n\n<p>Nem todas as p\u00e1ginas s\u00e3o iguais. Os artigos, as p\u00e1ginas de destino e as p\u00e1ginas jur\u00eddicas podem frequentemente ser armazenados em cache com um TTL curto ou revalida\u00e7\u00e3o. Os arquivos, as p\u00e1ginas de pesquisa, os pain\u00e9is de controlo, as \u00e1reas de conta e os checkouts permanecem din\u00e2micos. Se estiver em causa o armazenamento de p\u00e1ginas em cache, sigo a seguinte pr\u00e1tica: apenas armazenar em cache HTML p\u00fablico sem cookies, caso contr\u00e1rio \u201eprivado\u201c ou \u201eno-store\u201c. Se estiver a testar a micro-caching (por exemplo, 30-60 segundos para p\u00e1ginas muito frequentadas e n\u00e3o personalizadas), deve definir exclus\u00f5es rigorosas para par\u00e2metros de consulta e sess\u00f5es. O WordPress tem com <code>DONOTCACHEPAGE<\/code> uma constante que os modelos podem definir em p\u00e1ginas complicadas - utilizo-o sistematicamente para evitar erros.<\/p>\n\n<h2>Combinar o armazenamento em cache do lado do servidor de forma sensata<\/h2>\n\n<p>A cache do browser termina no cliente, mas tamb\u00e9m alivio o servidor com a cache de p\u00e1ginas, objectos e c\u00f3digos de opera\u00e7\u00e3o para <strong>Picos de carga<\/strong>. O cache de p\u00e1ginas fornece HTML est\u00e1tico antes mesmo de o PHP come\u00e7ar. O Redis ou o Memcached reduzem as consultas \u00e0 base de dados para pedidos repetidos e reduzem visivelmente o TTFB. O OPcache fornece fragmentos de bytecode PHP pr\u00e9-compilados, reduzindo assim o tempo de execu\u00e7\u00e3o. No final, o que conta \u00e9 uma liga\u00e7\u00e3o limpa entre a cache do servidor e a cache do browser, para que a segunda visita seja mais ou menos um sucesso. <strong>instant\u00e2neo<\/strong> obras.<\/p>\n\n<h2>Integra\u00e7\u00e3o de CDN sem surpresas<\/h2>\n\n<p>As CDNs utilizam a sua pr\u00f3pria l\u00f3gica TTL e respondem a \u201es-maxage\u201c. Por conseguinte, fa\u00e7o uma distin\u00e7\u00e3o clara: \u201emax-age\u201c para os navegadores, \u201es-maxage\u201c para o Edge. Se as implanta\u00e7\u00f5es estiverem pendentes, eu aciono uma purga direcionada em vez de destruir globalmente o \u201eCache Everything\u201c. Importante: Apenas armazenar HTML em cache no Edge se n\u00e3o houver cookies envolvidos. Caso contr\u00e1rio, s\u00e3o criados estados incorrectos porque a cache do Edge partilha respostas personalizadas. Para ativos, defino TTLs longos e confio na vers\u00e3o do nome do arquivo. As CDNs podem ignorar strings de consulta - outra raz\u00e3o para manter as vers\u00f5es no nome do ficheiro. A normaliza\u00e7\u00e3o do cabe\u00e7alho (sem valores \u201eVary\u201c sup\u00e9rfluos, \u201eContent-Type\u201c consistente) evita chaves de cache inchadas.<\/p>\n\n<h2>Passo-a-passo: instala\u00e7\u00e3o limpa<\/h2>\n\n<p>Come\u00e7o com um plugin e ativo a cache do navegador para CSS, JS, imagens e tipos de letra antes de ativar o <strong>.htaccess<\/strong> finalizar. Em seguida, defino um max-age elevado para os activos est\u00e1ticos e forne\u00e7o HTML com tempos curtos ou regras no-cache. Desactivo os ETags se estiverem envolvidos v\u00e1rios servidores e confio no Last-Modified plus 304. Depois, desencadeio um pr\u00e9-carregamento para que as p\u00e1ginas importantes estejam imediatamente dispon\u00edveis como c\u00f3pias est\u00e1ticas. Por fim, verifico os caminhos da loja, de in\u00edcio de sess\u00e3o e de administra\u00e7\u00e3o para que nenhum conte\u00fado privado seja armazenado no <strong>mem\u00f3ria tempor\u00e1ria<\/strong> terra.<\/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\/01\/wordpress-caching-office-2974.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Diagn\u00f3stico pr\u00e1tico com CLI e verifica\u00e7\u00f5es de cabe\u00e7alho<\/h2>\n\n<p>As DevTools s\u00e3o obrigat\u00f3rias, mas eu aprofundo os testes CLI. A <code>curl -I<\/code> mostra o cabe\u00e7alho sem descarregamento; com <code>-H<\/code> Simulo condi\u00e7\u00f5es. Por exemplo, verifico se as revalida\u00e7\u00f5es devolvem realmente 304, se a \u201eIdade\u201c aumenta a partir de um proxy\/CDN e se os cookies desactivam o caching.<\/p>\n\n<pre><code># Mostrar cabe\u00e7alho\ncurl -I https:\/\/example.com\/style.css\n\nSimular a revalida\u00e7\u00e3o do # (If-Modified-Since)\ncurl -I -H \"If-Modified-Since: Tue, 10 Jan 2023 10:00:00 GMT\" https:\/\/example.com\/style.css\n\nTeste # com cookie (deve for\u00e7ar o bypass)\ncurl -I -H \"Cookie: wordpress_logged_in_=1\" https:\/\/example.com\/<\/code><\/pre>\n\n<p>Certifico-me de que os activos t\u00eam um valor longo de \u201econtrolo de cache\u201c, idealmente \u201eimut\u00e1vel\u201c. O HTML deve ter \u201eno-cache\u201c ou um TTL curto. Se ainda recebo 200 em vez de 304, muitas vezes h\u00e1 redireccionamentos em jogo que invalidam ETags\/Last-Modified. Al\u00e9m disso, \u201eadd_header\u201c no Nginx s\u00f3 se aplica a respostas 200 por padr\u00e3o - com \u201ealways\u201c eu tamb\u00e9m defino os cabe\u00e7alhos para 304 e 301\/302.<\/p>\n\n<h2>Teste e valida\u00e7\u00e3o de cabe\u00e7alhos<\/h2>\n\n<p>Abro o DevTools, recarrego a p\u00e1gina uma vez, limpo a cache e recarrego para obter 304 vs. <strong>200<\/strong> para observar. No painel de rede, verifico o controlo da cache, a idade, o ETag\/load-modified e os tamanhos das respostas. Se ainda houver acessos diretos em vez de revalida\u00e7\u00f5es, verifico se h\u00e1 conflitos com redireccionamentos, cookies ou cadeias de consulta. Para os casos mais complicados, este artigo sobre as armadilhas dos cabe\u00e7alhos ajuda-me: <a href=\"https:\/\/webhosting.de\/pt\/http-cache-headers-sabotam-o-cache-cachefix\/\">Cabe\u00e7alho da cache de sabotagem<\/a>. Repito a verifica\u00e7\u00e3o ap\u00f3s cada atualiza\u00e7\u00e3o de plug-in porque as altera\u00e7\u00f5es \u00e0s regras s\u00e3o frequentemente feitas silenciosamente. <strong>passar<\/strong>.<\/p>\n\n<h2>Controlo de vers\u00f5es, CDN e elimina\u00e7\u00e3o de cache<\/h2>\n\n<p>Eu penduro o <strong>Vers\u00e3o<\/strong> aos nomes dos ficheiros (style.23.css em vez de style.css?ver=23) para que os navegadores mantenham longas caches e continuem a carregar novos conte\u00fados imediatamente. Uma CDN distribui ficheiros est\u00e1ticos globalmente, define os seus pr\u00f3prios TTLs em PoPs de ponta e reduz drasticamente os RTTs. Importante: s\u00f3 armazenar HTML em cache na CDN se n\u00e3o for necess\u00e1ria personaliza\u00e7\u00e3o, caso contr\u00e1rio, ser\u00e3o criados estados incorrectos. Durante a implementa\u00e7\u00e3o, altero o n\u00famero da vers\u00e3o automaticamente para que os utilizadores nunca fiquem presos a scripts antigos. \u00c9 assim que eu combino os TTLs r\u00edgidos do navegador com a seguran\u00e7a <strong>Quebra de cache<\/strong>.<\/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\/01\/wordpress-browsercache-setup2093.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Limpar o controle de vers\u00e3o em compila\u00e7\u00f5es do WordPress<\/h2>\n\n<p>O mais fi\u00e1vel \u00e9 um pipeline de constru\u00e7\u00e3o que escreve hashes em nomes de ficheiros (por exemplo. <code>app.9f3c.css<\/code>). O WordPress carrega ent\u00e3o exatamente este ficheiro - os navegadores podem mant\u00ea-lo durante um ano gra\u00e7as ao \u201eimut\u00e1vel\u201c. Como alternativa, se os nomes dos ficheiros n\u00e3o puderem ser alterados, defino o n\u00famero da vers\u00e3o dinamicamente a partir da data do ficheiro. Isto mant\u00e9m as cadeias de consulta corretas e fi\u00e1veis.<\/p>\n\n<pre><code>\/\/ functions.php (vers\u00e3o de recurso via filemtime)\nadd_action('wp_enqueue_scripts', function () {\n    $css = get_stylesheet_directory() . '\/dist\/style.css';\n    $ver = file_exists($css) ? filemtime($css) : null;\n    wp_enqueue_style('theme', get_stylesheet_directory_uri() . '\/dist\/style.css', [], $ver);\n});<\/code><\/pre>\n\n<p>Importante: Se o nome do ficheiro contiver vers\u00f5es, pode ser definido \u201eimut\u00e1vel\u201c. Se utilizar apenas cadeias de consulta, os navegadores devem ser capazes de revalidar para que as actualiza\u00e7\u00f5es cheguem de forma fi\u00e1vel. Tamb\u00e9m me certifico de que as ferramentas de compila\u00e7\u00e3o limpam os ficheiros antigos para que as CDNs n\u00e3o armazenem um n\u00famero desnecessariamente grande de variantes.<\/p>\n\n<h2>Guardar em cache e carregar corretamente as fontes da Web<\/h2>\n\n<p>As fontes Web precisam de TTLs longos, cabe\u00e7alhos CORS corretos e pr\u00e9-carregamento opcional para que <strong>Saltos de layout<\/strong> n\u00e3o aparecem. Coloco os ficheiros woff2 no mesmo dom\u00ednio ou defino Access-Control-Allow-Origin de forma limpa. Al\u00e9m disso, defina font-display: swap para que o texto permane\u00e7a vis\u00edvel imediatamente enquanto o tipo de letra est\u00e1 a carregar. Se quiser otimizar o tempo de carregamento dos seus tipos de letra, encontrar\u00e1 dicas \u00fateis aqui: <a href=\"https:\/\/webhosting.de\/pt\/wordpress-webfonts-otimizacao-do-tempo-de-carregamento-serverperf\/\">Carregar fontes da Web mais rapidamente<\/a>. Com cabe\u00e7alhos de cache limpos e uma pr\u00e9-conex\u00e3o a CDNs, encurto visivelmente o FOUT\/FOIT e asseguro uma <strong>Renderiza\u00e7\u00e3o<\/strong>-Resultados.<\/p>\n\n<h2>Ajustar corretamente os tipos de letra, CORS e Vary<\/h2>\n\n<p>As fontes de outra origem requerem CORS. Eu defino <code>Controlo de acesso - Permitir origem<\/code> (por exemplo, para o seu pr\u00f3prio dom\u00ednio ou \u201e*\u201c para verdadeiramente p\u00fablico) e evitar uma <code>Variar: Origem<\/code>, que inflaciona as chaves da cache. Recomendado para fontes: <code>p\u00fablico, max-age=31536000, imut\u00e1vel<\/code>. O pr\u00e9-carregamento melhora o First Paint, mas n\u00e3o altera o TTL - o pr\u00e9-carregamento e o hard caching complementam-se. Tamb\u00e9m n\u00e3o estou a esquecer que a entrega comprimida (<code>br<\/code>\/<code>gzip<\/code>) a <code>Vary: Aceitar-Codifica\u00e7\u00e3o<\/code> \u00e9 necess\u00e1rio para que os proxies se separem corretamente.<\/p>\n\n<h2>Padr\u00f5es de erro t\u00edpicos e solu\u00e7\u00f5es r\u00e1pidas<\/h2>\n\n<p>Se aparecer um c\u00f3digo antigo ap\u00f3s uma atualiza\u00e7\u00e3o, o <strong>Versionamento<\/strong> no nome do ficheiro. Se o navegador recarregar completamente todas as vezes, os cabe\u00e7alhos definem instru\u00e7\u00f5es contradit\u00f3rias ou os proxies removem-nas no caminho. Se um checkout for cancelado, o site est\u00e1 provavelmente a armazenar em cache p\u00e1ginas do lado da sess\u00e3o ou respostas da API. Se os caminhos de administra\u00e7\u00e3o entrarem na cache, as exclus\u00f5es para wp-admin e login est\u00e3o em falta ou um plugin est\u00e1 a armazenar em cache globalmente. Resolvo isto desactivando passo a passo, consolidando cabe\u00e7alhos, excluindo caminhos cr\u00edticos e, finalmente, o efeito com o estado 304 <strong>confirmar<\/strong>.<\/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\/01\/wordpress-caching-fehler-9834.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Pormenores frequentemente negligenciados que fazem uma grande diferen\u00e7a<\/h2>\n\n<ul>\n  <li><strong>Nginx add_header<\/strong> n\u00e3o se aplica a 304\/redirects sem \u201ealways\u201c - os cabe\u00e7alhos da cache ficam ent\u00e3o em falta para as valida\u00e7\u00f5es. Eu defino sempre \u201ealways\u201c.<\/li>\n  <li><strong>Expira\u00e7\u00f5es vs. controlo da cache:<\/strong> \u201eO \u201cCache-Control\u201e tem prioridade, o \u201cExpires\" serve de alternativa para clientes antigos. Evitar informa\u00e7\u00f5es duplicadas e contradit\u00f3rias.<\/li>\n  <li><strong>ETag em configura\u00e7\u00f5es multi-servidor:<\/strong> ETags inconsistentes destroem 304. Desactivo ETags ou utilizo validadores fracos e confio em \u201eLast-Modified\u201c.<\/li>\n  <li><strong>Variar ao m\u00ednimo:<\/strong> \u201eO \u201cVary: Accept-Encoding\u201e \u00e9 obrigat\u00f3rio para a compress\u00e3o, o \u201cVary: Cookie\" incha as caches de borda - \u00e9 melhor contornar o cookie.<\/li>\n  <li><strong>SVG e tipo MIME:<\/strong> Correto <code>imagem\/svg+xml<\/code> definir, dar um TTL longo e considerar SVGs em linha para \u00edcones cr\u00edticos.<\/li>\n  <li><strong>Evitar cadeias de redireccionamento:<\/strong> Cada 301\/302 pode perder validadores e for\u00e7ar 200 - URLs limpos sem cascatas.<\/li>\n  <li><strong>Utilizar a prioridade\/precarregamento de forma direcionada:<\/strong> <code>fetchpriority=\"high\"<\/code> ou pr\u00e9-carregamento para activos cr\u00edticos acelera a primeira chamada; o armazenamento em cache \u00e9 eficaz para os utilizadores que regressam.<\/li>\n  <li><strong>Diferenciar REST-API:<\/strong> Os JSON p\u00fablicos, que raramente mudam, podem ser armazenados em cache por um breve per\u00edodo; os pontos finais com tokens\/cookies s\u00e3o estritamente \u201eprivados\u201c.<\/li>\n<\/ul>\n\n<h2>Brevemente resumido<\/h2>\n\n<p>Eu confio na clareza <strong>Regras<\/strong>TTLs longos para activos, respostas HTML curtas ou revalidadas, controlo de vers\u00f5es e um \u00fanico plugin de cache. Depois, combino a cache do browser com a cache de p\u00e1ginas, objectos e c\u00f3digos de opera\u00e7\u00e3o para reduzir a carga do servidor. Verifico o DevTools, procuro o 304, verifico os cabe\u00e7alhos e elimino conflitos com redireccionamentos ou cookies. Para o teste pr\u00e1tico, comparo as medi\u00e7\u00f5es na primeira chamada e nas chamadas repetidas e concentro-me nas melhorias vis\u00edveis. Se seguir estes passos, pode levar o WordPress a um n\u00edvel fi\u00e1vel de cache do navegador. <strong>Velocidade<\/strong> e mant\u00e9m os utilizadores e os motores de busca satisfeitos.<\/p>","protected":false},"excerpt":{"rendered":"<p>O WordPress e a cache do navegador s\u00e3o frequentemente configurados incorretamente. Saiba como configurar corretamente os cabe\u00e7alhos de cache do wp para obter um desempenho \u00f3timo do wordpress.<\/p>","protected":false},"author":1,"featured_media":17051,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_crdt_document":"","inline_featured_image":false,"footnotes":""},"categories":[733],"tags":[],"class_list":["post-17058","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"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":"945","_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":null,"_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":"WordPress Browser 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":"17051","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/17058","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=17058"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/posts\/17058\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media\/17051"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/media?parent=17058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/categories?post=17058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pt\/wp-json\/wp\/v2\/tags?post=17058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}