technical

Serve um 404 real, não um soft-404

O MetricSpot pede um URL aleatório inexistente e verifica o estado. Soft-404s (200 OK numa página de "não encontrado") incham o índice com URLs lixo e confundem os crawlers.

O que esta verificação faz

Emite um pedido a um URL aleatório no teu domínio que quase de certeza não existe (algo como /__metricspot_probe_${random}). A verificação falha quando:

  • O servidor devolve 200 OK com uma página de “não encontrado” (um soft 404 — o pior caso).
  • O servidor devolve 5xx em vez de 404.
  • O servidor devolve 200 com um redirecionamento para a homepage (também um soft 404 aos olhos do Google).

Passa quando o servidor devolve um 404 real (ou 410 Gone) com uma página de erro útil.

Porque é importante

Os soft 404s confundem os crawlers e corrompem o teu índice.

  • Inchaço do índice. O Google indexa uma página soft-404 como qualquer 200 normal. Um site com um CMS com bugs que devolve 200 para gralhas pode acabar com milhares de URLs lixo no índice.
  • Crawl budget desperdiçado. O Googlebot revisita URLs soft-404 à procura de conteúdo novo, consumindo o crawl budget destinado a páginas reais.
  • Erros no Search Console. O Search Console acabará por marcar páginas soft-404 como erros Soft 404 e parar de as indexar — mas a limpeza demora semanas.
  • UX. Uma página 404 real pode sugerir conteúdo relacionado, encaminhar utilizadores para a pesquisa e recuperar a visita. Um 200-com-redirecionamento-para-a-homepage abandona-os sem qualquer sinal de que o URL original estava partido.

Como corrigir

Configura o servidor para devolver 404 Not Found em caminhos desconhecidos e renderiza uma página útil por cima.

nginx — define uma página de erro personalizada que continua a devolver 404:

server {
  error_page 404 /404.html;

  location = /404.html {
    internal;
  }
}

Apache (.htaccess):

ErrorDocument 404 /404.html

Next.js (App Router):

// app/not-found.tsx
export default function NotFound() {
  return (
    <main>
      <h1>404 — Página não encontrada</h1>
      <p>Tenta a <a href="/">página inicial</a> ou a <a href="/search/">pesquisa</a>.</p>
    </main>
  );
}

O Next.js serve isto automaticamente com código de estado 404.

Astro:

---
// src/pages/404.astro
---
<html>
  <head><title>404 — Não encontrado</title></head>
  <body>
    <h1>404 — Página não encontrada</h1>
    <a href="/">Voltar à página inicial</a>
  </body>
</html>

O Astro compila isto como um 404.html estático que o nginx serve automaticamente com o código de estado correto.

WordPress — os temas trazem um template 404.php. Se o teu redireciona para a homepage em vez de devolver 404, verifica o functions.php à procura de uma chamada wp_redirect() mal-orientada e remove-a.

Torna a página útil. Um 404 real deve:

  • Ser honesto — o cabeçalho lê “Página não encontrada”, não “Bem-vindo de volta.”
  • Sugerir 3–4 páginas populares (a navegação do site não conta; oferece ligações específicas).
  • Incluir pesquisa, se a tiveres.
  • Combinar com a identidade do site para que o utilizador saiba que continua no teu site.

Audita por ti:

curl -sI https://teudominio.com/__definitivamente_nao_existe

A primeira linha tem de ser HTTP/1.1 404 Not Found (ou HTTP/2 404). Qualquer outra coisa falha a verificação.

Perguntas frequentes

Devo redirecionar 404s para a homepage?

Não. Um redirecionamento 301 para a página inicial diz ao Google “este URL mudou para /” — o que é mentira. O utilizador vê a homepage e não tem ideia de que o URL original estava errado; o URL fica agora “indexado” como duplicado da página inicial. Devolve sempre um 404 real.

Qual é a diferença entre 404 e 410?

404 Not Found significa “não conseguimos encontrar este recurso agora.” 410 Gone significa “este recurso existiu mas foi removido permanentemente.” O Google remove URLs 410 do índice mais depressa do que URLs 404. Usa 410 para conteúdo que apagaste deliberadamente; o 404 serve bem para gralhas e bots a sondar vulnerabilidades.

A minha página 404 devolve 200 — como corrijo isso?

Duas causas comuns: (1) o teu CMS usa uma rota curinga que apanha tudo, incluindo 404s, e serve-os com 200; (2) o teu CDN colocou em cache uma resposta partida com estado 200. Para (1), define explicitamente res.status(404) no handler de não-encontrado da tua framework. Para (2), limpa a cache do CDN e verifica diretamente contra a origem.

Fontes

Última atualização 2026-05-11