Ir para o conteúdo principal

Guias / Corrigir: guias para os erros que aparecem de verdade

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.

ErroO que aconteceu no nível da rede ou do protocoloOnde 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 Vary que 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 com curl -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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Libere espaço em disco e reinicie o Chrome. Um disco cheio pode deixar o navegador sem um cache funcional.
  6. Atualize o Chrome em chrome://settings/help e tente de novo.
  7. 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

  1. 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.
  2. Leia os cabeçalhos com o comando curl acima e remova no-store das páginas que não precisam dele.
  3. 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.
  4. Num app Android, adicione a permissão INTERNET, defina um modo de cache diferente de LOAD_CACHE_ONLY e registre onReceivedError para o frame principal.
  5. 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

Verificar agora

Faça a verificação gratuita no seu próprio site, sem precisar de conta.

HTTP check

Monitorar permanentemente

Seja avisado no momento em que algo quebrar: o HostTracker verifica de mais de 300 localidades e notifica você por e-mail, SMS, Slack, Telegram e mais.

Recursos do HostTracker

Mais nesta seção: Corrigir: guias para os erros que aparecem de verdade