ERR_CACHE_MISS: o que significa e como corrigir
ERR_CACHE_MISS significa que o Chrome precisou de uma cópia salva da página e o cache dele não tinha nenhuma. Aparece com mais frequência quando você usa Voltar ou Recarregar numa página criada pelo envio de um formulário, caso em que o Chrome a intitula “Confirm Form Resubmission” (confirmar o reenvio do formulário).
O que significa ERR_CACHE_MISS
O Chromium, a base do Chrome, do Edge, do Brave e do Opera, define CACHE_MISS (-400) como “The cache does not have the requested entry.” (o cache não tem a entrada solicitada). Uma entrada ausente no cache normalmente é inofensiva, porque o navegador simplesmente pergunta ao servidor. O erro só aparece quando o navegador foi instruído a responder a partir do cache e a não usar a rede. No código-fonte do Chromium isso é a flag de carregamento LOAD_ONLY_FROM_CACHE, descrita como uma navegação que falha se o cache não puder atendê-la. Quando o cache não consegue responder, o carregamento falha com ERR_CACHE_MISS e nenhuma requisição é enviada.
Duas situações comuns geram um carregamento só pelo cache. A primeira é uma navegação pelo histórico (Voltar ou Avançar) até uma página criada por uma requisição POST. O Chrome não envia um POST de novo por conta própria, porque um POST repetido pode repetir a ação, como um segundo pedido, pagamento ou mensagem. Um comentário no código da página de erro do Chromium descreve o caso como “navigating through the history to an uncached page created by a POST”. A segunda situação é um aplicativo que pede ao motor de navegador embutido que fique fora da rede, por exemplo um app Android que executa uma WebView em modo somente cache.
A entrada pode estar ausente porque o navegador nunca armazenou a resposta ou porque a entrada foi removida. Uma resposta com Cache-Control: no-store nunca é armazenada: a RFC 9111 diz que um cache não deve armazenar nenhuma parte da requisição nem da resposta, e o Chromium não guarda conteúdo no-store. Limpar os dados de navegação entre o envio do formulário e o clique em Voltar também remove entradas. Se o Chrome não consegue abrir o cache em disco, por exemplo porque o disco está cheio ou outro programa trava os arquivos do cache, nada é armazenado e um carregamento só pelo cache não tem o que ler.
Como o erro aparece
Num navegador desktop, você usa Voltar ou Recarregar e vê uma página intitulada “Confirm Form Resubmission”. Ela diz que a página precisa de dados que você digitou antes e que enviá-los de novo repete a ação que a página executou anteriormente. Pede que você use o botão de recarregar do navegador para reenviar os dados. O ERR_CACHE_MISS aparece impresso no rodapé. Edge, Brave, Opera e outros navegadores baseados em Chromium mostram a mesma página. Num Chrome em português o título aparece traduzido, mas o código no rodapé é o mesmo. No DevTools, o painel Network lista a requisição da página como falha com net::ERR_CACHE_MISS.
Desenvolvedores Android veem o erro no próprio código. Uma WebView o reporta por meio de onReceivedError:
webView.webViewClient = object : WebViewClient() {
override fun onReceivedError(
view: WebView, request: WebResourceRequest, error: WebResourceError
) {
if (request.isForMainFrame) {
Log.w("WebView", "${request.url}: ${error.description}")
// https://example.com/: net::ERR_CACHE_MISS
}
}
}
O comentário no código mostra o tipo de linha de log que você recebe.
ERR_CACHE_MISS e erros parecidos
ERR_CACHE_MISS é o único erro desta tabela em que o navegador deliberadamente não tentou a rede. Nos outros, a falha veio durante a tentativa, ou o dispositivo não tinha conexão para tentar. Os números são os códigos de erro internos do Chromium.
| Erro | O que aconteceu no nível da rede ou do protocolo | Onde olhar primeiro |
|---|---|---|
| ERR_CACHE_MISS (-400) | O navegador só podia usar o cache e o cache não tinha a entrada. Nenhuma requisição chegou ao servidor. | O cabeçalho Cache-Control da resposta original, se um POST criou a página, o modo de cache do app. |
| ERR_CACHE_READ_FAILURE (-401) | Existe uma entrada no cache, mas o cache em disco não conseguiu lê-la. | Um cache do navegador danificado ou erros de disco. Limpar os arquivos em cache geralmente resolve. |
| ERR_CLEARTEXT_NOT_PERMITTED (-29) | O Android bloqueou uma requisição http:// por causa da política de segurança de rede do app. | As configurações de cleartext no manifesto do app ou na configuração de segurança de rede. |
| ERR_INTERNET_DISCONNECTED (-106) | O sistema operacional informa que a conexão com a Internet foi perdida. | Wi-Fi, cabo, modo avião, o roteador. |
| ERR_NAME_NOT_RESOLVED (-105) | A consulta DNS não devolveu nenhum endereço IP utilizável, então nenhuma conexão foi tentada. | Os registros DNS do domínio e o resolvedor do dispositivo. |
| ERR_CONNECTION_TIMED_OUT (-118) | O SYN saiu e nada voltou até o cliente desistir. | Firewalls que descartam pacotes, e se o host está no ar. |
O que causa o ERR_CACHE_MISS
- Voltar ou Recarregar numa página criada pelo POST de um formulário. É a causa mais comum.
- Uma resposta com
Cache-Control: no-store. O Chrome não a guardou, então não há cópia para mostrar ao voltar. - Um framework que adiciona no-store sem que ninguém tenha escolhido isso. As sessões do PHP fazem isso por padrão (veja a seção do servidor abaixo), e as áreas de login e administração de muitas aplicações também enviam no-store.
- Um cabeçalho
Varyque deixou de bater. Se um valor da requisição pelo qual a resposta varia, como um cookie, mudou depois que a página foi armazenada, o Chromium trata a cópia guardada como incompatível. - Um cache que foi limpo ou não pode ser usado: dados de navegação apagados depois do envio, um disco cheio, ou software de segurança que trava arquivos na pasta do perfil do Chrome.
- Uma extensão que altera cabeçalhos ou gerencia o cache. Testar numa janela anônima mostra se há uma extensão envolvida.
- Uma WebView do Android com o modo de cache
LOAD_CACHE_ONLY, ou com carregamentos de rede bloqueados. A WebView bloqueia carregamentos de rede por padrão quando o app não tem a permissão INTERNET.
Causas no servidor e configuração
O dono do site não pode limpar o cache de um visitante. Duas coisas no servidor decidem se o botão Voltar funciona: como o fluxo do formulário responde a um POST e quais cabeçalhos de cache as páginas carregam.
Leia os cabeçalhos que a página envia
Envie o formulário com curl e imprima só os cabeçalhos da resposta:
curl -s -D - -o /dev/null -d 'name=test' https://example.com/submit
HTTP/2 200
content-type: text/html; charset=UTF-8
cache-control: no-store, no-cache, must-revalidate
pragma: no-cache
O segundo bloco mostra uma resposta que causa o erro, porque no-store diz a todo cache para não guardar nada. Verifique todas as camadas que podem adicionar o cabeçalho: a aplicação, o servidor web (grep -rn "no-store" /etc/nginx/), as regras do CDN e qualquer proxy reverso na frente do site.
Redirecionar após o POST com 303
A correção mais confiável é mudar o fluxo, não o cabeçalho. Responda ao POST com um redirecionamento para uma página GET normal. O navegador então armazena um resultado GET simples, e Voltar e Recarregar nunca precisam repetir o POST. É o padrão Post/Redirect/Get, e o status 303 See Other existe para isso. No Express:
app.post('/checkout', async (req, res) => {
const order = await createOrder(req.body);
res.redirect(303, `/orders/${order.id}`);
});
Em PHP:
<?php
// ...processe o formulário e depois:
header('Location: /thanks', true, 303);
exit;
Mantenha no servidor uma proteção contra envio duplicado, como um token de formulário de uso único ou uma chave de pedido única, porque visitantes dão clique duplo.
Sessões do PHP e outros padrões de framework
A configuração session.cache_limiter do PHP tem como padrão nocache. Com ela, session_start() envia Cache-Control: no-store, no-cache, must-revalidate em toda página que inicia uma sessão. O manual do PHP lista private_no_expire como a alternativa que envia Cache-Control: private, max-age=... (o tempo de vida vem de session.cache_expire, 180 minutos por padrão). Definir o limiter como uma string vazia desliga os cabeçalhos automáticos, e assim você pode enviar os seus:
<?php
session_cache_limiter(''); // impede o PHP de adicionar seus próprios cabeçalhos de cache
session_start();
header('Cache-Control: private, no-cache');
private, no-cache deixa o navegador guardar uma cópia, mas exige validação antes de reutilizá-la num carregamento normal. Use só em páginas que podem ser guardadas com segurança no disco do visitante. Páginas com dados de conta ou pagamentos devem manter no-store. O preço é que Voltar nessas páginas não consegue mostrar uma cópia salva, mais um motivo para usar o redirecionamento acima.
WebView do Android
Duas configurações num app Android produzem o erro. Primeiro, o manifesto precisa da permissão INTERNET. A documentação do Android diz que setBlockNetworkLoads é true por padrão quando o app não a tem, e o Chromium transforma essa configuração num carregamento só pelo cache:
<uses-permission android:name="android.permission.INTERNET" />
Segundo, confira o modo de cache. A documentação descreve LOAD_CACHE_ONLY como “Don't use the network, load from the cache” (não use a rede, carregue do cache), então toda página que não está em cache falha com ERR_CACHE_MISS:
val settings = webView.settings
settings.cacheMode = WebSettings.LOAD_DEFAULT // cache quando válido, senão a rede
// Pensado para uso offline: cópia em cache mesmo expirada, senão a rede
// settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
settings.blockNetworkLoads = false // lança SecurityException sem a permissão
Frameworks que renderizam páginas com uma WebView do Android seguem a mesma regra do Android. A documentação do Flutter, por exemplo, diz que apps Android precisam declarar o uso da Internet no AndroidManifest.xml.
Como aparece visto de fora
O ERR_CACHE_MISS vem do navegador de um único visitante, então uma verificação externa não o reproduz. O que uma verificação mostra é se a própria página estava saudável naquele momento. Compare estes padrões:
- Todos os pontos de verificação recebem a página, mas os visitantes veem o erro depois de Voltar. O servidor está bem, então olhe o fluxo do formulário e os cabeçalhos de cache.
- Os relatos começam logo depois de um deploy ou de uma mudança no CDN. Uma regra nova ou uma atualização de framework provavelmente adicionou
no-store. Compare os cabeçalhos da origem e do endereço público comcurl -I. - Só os usuários do seu app Android relatam o erro. A causa está nas configurações da WebView do app, não no servidor.
- A página também falha nos pontos de verificação. É outro problema, e o guia “This site can't be reached” é o lugar para começar.
O verificador HTTP confere o status HTTP, o tempo de resposta e a disponibilidade do servidor de um host a partir de locais do mundo todo, o que confirma o primeiro caso rapidamente.
Como corrigir o ERR_CACHE_MISS
Se você é o visitante
- Não use Voltar para retornar ao resultado de um formulário. Abra a página de novo pelo menu do site ou digite o endereço. Isso envia uma requisição GET normal.
- Pense antes de reenviar. Recarregar envia os dados do formulário de novo. Para uma busca ou um login, tudo bem. Para um pagamento, um pedido ou um comentário, confira antes o histórico de pedidos ou o próprio site para ver se o primeiro envio funcionou.
- Tente uma janela anônima. Pressione Ctrl+Shift+N (Windows, Linux) ou Cmd+Shift+N (macOS). As extensões ficam desativadas ali, a menos que você as tenha permitido. Se o erro sumir, desative as extensões uma a uma em
chrome://extensions. - Limpe os arquivos em cache. Pressione Ctrl+Shift+Delete (Cmd+Shift+Delete no macOS), escolha “Imagens e arquivos armazenados em cache” e limpe. Isso ajuda quando o cache está danificado, mas não traz de volta uma página que você já deixou.
- Libere espaço em disco e reinicie o Chrome. Um disco cheio pode deixar o navegador sem um cache funcional.
- Atualize o Chrome em
chrome://settings/helpe tente de novo. - Num app Android, atualize o app e, se o seu dispositivo listar, o Android System WebView na Google Play, e confirme que o app tem permissão para usar dados móveis e Wi-Fi.
Se você administra o site
- Descubra de qual página os visitantes vêm. Se for o resultado de um formulário, mude o fluxo para Post/Redirect/Get com um 303.
- Leia os cabeçalhos com o comando curl acima e remova
no-storedas páginas que não precisam dele. - Confira os padrões do framework, como o session limiter do PHP, as configurações do plugin de cache do CMS e as regras do CDN.
- Num app Android, adicione a permissão INTERNET, defina um modo de cache diferente de
LOAD_CACHE_ONLYe registreonReceivedErrorpara o frame principal. - Teste de novo num perfil limpo do Chrome: envie o formulário, use Voltar e confira que você chega a uma página normal.
O que o monitoramento mostra e o que não mostra
Um monitor não usa o botão Voltar, então não vê o ERR_CACHE_MISS. Ele mostra se o site estava no ar quando um visitante tentou. A HostTracker verifica sites a partir de mais de 300 pontos de verificação em 158 cidades e envia alertas por e-mail, SMS, chamada de voz, Slack, Telegram e mais. Se todos os pontos estavam verdes enquanto um visitante relatou o erro, o servidor estava saudável, e a causa está nos cabeçalhos, no fluxo do formulário ou no navegador do visitante.
Perguntas frequentes
O ERR_CACHE_MISS é um problema do site?
Em geral não. É uma mensagem do navegador. Um site pode torná-lo mais comum ao enviar no-store em resultados de formulário ou ao responder um POST com uma página em vez de um redirecionamento, mas o site em si não está fora do ar.
É seguro clicar em Recarregar em “Confirm Form Resubmission”?
Isso envia os mesmos dados do formulário de novo. Para uma busca, é inofensivo. Para um pedido, um pagamento ou uma mensagem, a ação pode acontecer duas vezes. Confira antes o histórico do próprio site.
Limpar o cache resolve o ERR_CACHE_MISS?
Só quando o próprio cache está danificado. Se o erro vem de Voltar depois de um formulário, limpar o cache remove justamente as entradas de que você precisaria, então abra a página de novo.
Por que só vejo isso no Chrome?
Outros navegadores tratam a mesma situação com mensagens próprias e têm regras próprias para armazenar e reutilizar resultados de formulário. O código ERR_CACHE_MISS pertence à pilha de rede do Chromium, e por isso Edge, Brave e Opera também o mostram.
Por que meu app Android mostra net::ERR_CACHE_MISS?
A WebView foi instruída a usar só o cache. Os motivos usuais são a falta da permissão INTERNET, que bloqueia carregamentos de rede por padrão, e o modo de cache LOAD_CACHE_ONLY. Corrija a permissão ou o modo e recarregue.
Como evito que meus visitantes vejam isso depois de um formulário?
Responda ao POST com um redirecionamento 303 para uma página de resultado que carrega com GET. Assim Voltar e Recarregar funcionam numa página normal e nunca pedem reenvio.
“Confirm Form Resubmission” é a mesma coisa que ERR_CACHE_MISS?
Sim. É a página especial que o Chrome mostra para o ERR_CACHE_MISS quando a página que falhou veio de um POST. O código aparece impresso no rodapé dessa página.
Fontes e leitura adicional
- Chromium net error list: as definições de CACHE_MISS (-400), CACHE_READ_FAILURE (-401) e dos outros códigos da tabela acima.
- RFC 9111, HTTP Caching: a seção 5.2.2.5 sobre a diretiva no-store.
- Android: WebSettings:
setCacheMode,LOAD_CACHE_ONLYesetBlockNetworkLoads. - Manual do PHP: session_cache_limiter: os cabeçalhos que cada limiter envia.