Skip to content

Código de status HTTP · Erros do cliente (4xx)

Erro 404 Not Found

O erro 404 Not Found significa que o servidor não encontrou nada no endereço pedido, ou decidiu não revelar que existe algo ali. A causa mais comum é um link quebrado: a página foi movida ou apagada sem redirecionamento, ou a URL foi digitada errado.

Dados sobre este código de status
Classe4xx, Erros do cliente
Definido emRFC 9110 §15.5.5
Pode ir para o cache por padrãoSim, de forma heurística; navegadores e CDNs podem guardá-la mesmo sem cabeçalhos explícitos
Pode repetir o pedidoNão do mesmo jeito; a mesma URL continua dando 404 até algo mudar no servidor
Cabeçalhos relevantes
  • Cache-Control: use max-age curto ou no-store se o recurso puder aparecer em breve

O que significa o 404

A RFC 9110, seção 15.5.5, define o 404 como o servidor de origem não ter uma representação atual do recurso pedido, ou não querer revelar que ela existe. A segunda parte importa: o GitHub responde 404 para um repositório privado que você não pode ver, em vez de 403, justamente para ninguém de fora confirmar que ele existe.

O 404 não diz se a ausência é temporária ou definitiva. Quando você sabe que a página saiu do ar de vez, a especificação prefere o 410 Gone. O 404 também pode ser armazenado em cache de forma heurística, então uma CDN pode continuar servindo o erro por um tempo depois que a página for publicada, a menos que você envie Cache-Control.

O que vale é o código na linha de status, não o conteúdo. Uma página bonita de "não encontrado" servida com 200 OK é um soft 404: o Google sinaliza no Search Console, o monitoramento acha que está tudo certo e clientes de API tentam interpretar aquilo como dados.

Causas comuns

Se você está visitando o site

  • Erro de digitação no endereço, ou diferença de maiúsculas e minúsculas: /Sobre e /sobre são caminhos diferentes na maioria dos servidores Linux.
  • Um favorito antigo ou resultado de busca que aponta para uma página que foi renomeada ou removida.
  • Um link em outro site que nunca foi atualizado depois que o site de destino mudou de estrutura.

Se você administra o servidor

  • A página ou produto foi apagado, ou o slug mudou, e ninguém criou um redirecionamento 301 da URL antiga.
  • Uma SPA (React, Vue) com roteamento no cliente: /painel funciona quando você navega até lá, mas dá 404 ao atualizar a página, porque o servidor não tem arquivo nesse caminho nem fallback para o index.html.
  • Barra no final da URL tratada de forma diferente pelos links e pelo servidor (/docs e /docs/), ou arquivos que ficaram fora do deploy porque a pasta de build ou o document root está errado.
  • Numa API, o ID do caminho não existe, foi excluído logicamente ou pertence a outro cliente e está escondido de propósito.

Como resolver

Se você está visitando o site

  • Confira a grafia e as maiúsculas da URL, depois apague o último trecho do caminho para cair na seção de cima.
  • Use a busca do próprio site ou o mapa do site para descobrir para onde o conteúdo foi.
  • Se o conteúdo realmente sumiu, procure uma cópia no Wayback Machine (web.archive.org).
  • Se você chegou por um link em outro site, avise o dono desse site; a correção é do lado dele.

Se você administra o servidor

  • Crie um redirecionamento 301 (ou 308) de cada URL antiga que ainda recebe visitas ou backlinks para a página nova mais próxima. Os logs de acesso e o relatório "Não encontrado (404)" do Google Search Console mostram quais URLs importam.
  • Numa SPA, faça os caminhos desconhecidos caírem no index.html (nginx: try_files $uri $uri/ /index.html) e deixe o roteador do cliente mostrar a tela de não encontrado.
  • Responda 410 Gone para conteúdo removido de propósito, assim os buscadores tiram a URL do índice mais rápido.
  • Mantenha sua página 404 personalizada, mas garanta que ela sai com status 404, não 200. Teste com curl -I https://example.com/nao-existe.

Como enviar um 404

Em páginas e layouts do Next.js (fora dos route handlers), chame notFound() de next/navigation; ele renderiza o not-found.tsx com status 404.

Express (Node.js)
app.get('/reports/:id', (req, res) => {
  res.status(404).json({ error: 'Report not found' });
});
Next.js App Router (route handler)
// app/reports/[id]/route.ts
export async function GET() {
  return Response.json({ error: 'Report not found' }, { status: 404 });
}
Go net/http
mux.HandleFunc("GET /reports/{id}", func(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusNotFound) // 404
	w.Write([]byte(`{"error":"Report not found"}`))
})
Python FastAPI
from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/reports/{id}")
def get_report(id: str):
    raise HTTPException(status_code=404, detail="Report not found")
Nginx
# Custom page, real 404 status
error_page 404 /404.html;
location = /404.html {
  internal;
}

# Deliberately hide a path
location /internal/ {
  return 404;
}

Costuma ser confundido com

404 vs 410
O 410 Gone afirma que o recurso existia e sumiu de vez; o 404 não diz se ele existiu nem se vai voltar.
404 vs 403
O 403 confirma que o recurso existe mas você não tem acesso; muitos servidores respondem 404 no lugar para não revelar que ele existe.
404 vs 400
O 400 indica que o pedido em si está malformado; o 404 indica que o pedido está correto, só não há nada naquela URL.

Perguntas frequentes

Erro 404 prejudica o SEO?
Um 404 para uma página que realmente não existe mais é normal e não afeta o resto do site; o Google tira a URL do índice depois de rastreá-la de novo. O prejuízo aparece quando a URL perdida tinha backlinks ou tráfego: redirecione essas com 301 para a página equivalente mais próxima.
O que é soft 404?
É uma página que diz ao visitante que o conteúdo não foi encontrado, mas responde com status 200. O Google aponta esses casos no Search Console e pode removê-los do índice mesmo assim. A correção é devolver um 404 ou 410 de verdade.
Uma API deve responder 404 ou 200 vazio?
Use 404 quando um recurso específico não existe, como GET /usuarios/42. Use 200 com lista vazia para uma busca em coleção sem resultados, como GET /usuarios?nome=zed: a coleção existe, só não tem itens.
Por que meu app React ou Vue dá 404 quando atualizo a página?
O navegador pede /painel ao servidor, mas o servidor só tem o index.html. Configure um fallback para que caminhos desconhecidos entreguem o index.html (try_files $uri $uri/ /index.html no nginx, ou a regra equivalente da sua hospedagem) e deixe o roteador do cliente assumir.

Revisado em por Arielton Oberek.