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.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 9110 §15.5.5 |
| Pode ir para o cache por padrão | Sim, de forma heurística; navegadores e CDNs podem guardá-la mesmo sem cabeçalhos explícitos |
| Pode repetir o pedido | Não do mesmo jeito; a mesma URL continua dando 404 até algo mudar no servidor |
| Cabeçalhos relevantes |
|
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.
app.get('/reports/:id', (req, res) => {
res.status(404).json({ error: 'Report not found' });
});// app/reports/[id]/route.ts
export async function GET() {
return Response.json({ error: 'Report not found' }, { status: 404 });
}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"}`))
})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")# 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.