technical

Sirve un 404 real, no un soft-404

MetricSpot pide una URL inexistente aleatoria y comprueba el estado. Los soft-404 (200 OK en una página de "no encontrado") inflan el índice con URLs basura y confunden a los rastreadores.

Qué comprueba esta auditoría

Envía una petición a una URL aleatoria de tu dominio que casi con seguridad no existe (algo como /__metricspot_probe_${random}). La comprobación falla cuando:

  • El servidor devuelve 200 OK con una página de “no encontrado” (un soft 404, el peor caso).
  • El servidor devuelve 5xx en vez de 404.
  • El servidor devuelve 200 con una redirección a la home (también es un soft 404 a ojos de Google).

Pasa cuando el servidor devuelve un 404 real (o 410 Gone) con una página de error útil.

Por qué importa

Los soft 404 confunden a los rastreadores y corrompen tu índice.

  • Inflado del índice. Google indexa una página soft-404 como cualquier 200 normal. Un sitio con un CMS con bugs que devuelve 200 ante erratas puede acabar con miles de URLs basura en el índice.
  • Crawl budget desperdiciado. Googlebot revisita las URLs soft-404 buscando contenido nuevo, consumiendo el crawl budget de páginas reales.
  • Errores en Search Console. Search Console acabará marcando las páginas soft-404 como errores Soft 404 y dejará de indexarlas, pero la limpieza tarda semanas.
  • UX. Una página 404 real puede sugerir contenido relacionado, llevar al usuario a la búsqueda y recuperar la visita. Un 200 redirigido a la home lo deja varado sin ninguna señal de que la URL original estaba rota.

Cómo solucionarlo

Configura tu servidor para devolver 404 Not Found en rutas desconocidas, y renderiza una página útil encima.

nginx — define una página de error personalizada que siga devolviendo 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 no encontrada</h1>
      <p>Prueba la <a href="/">home</a> o <a href="/search/">búsqueda</a>.</p>
    </main>
  );
}

Next.js sirve esto automáticamente con código de estado 404.

Astro:

---
// src/pages/404.astro
---
<html>
  <head><title>404 — No encontrado</title></head>
  <body>
    <h1>404 — Página no encontrada</h1>
    <a href="/">Volver al inicio</a>
  </body>
</html>

Astro lo construye como un 404.html estático que nginx sirve con el código de estado correcto automáticamente.

WordPress — los temas incluyen una plantilla 404.php. Si el tuyo redirige a la home en vez de devolver 404, revisa functions.php por un wp_redirect() mal puesto y elimínalo.

Haz que la página sea útil. Un 404 real debería:

  • Ser honesto: el encabezado dice “Página no encontrada”, no “Bienvenido de nuevo”.
  • Sugerir 3 o 4 páginas populares (la navegación global no cuenta; ofrece enlaces concretos).
  • Incluir buscador si lo tienes.
  • Mantener la marca del sitio para que el usuario sepa que sigue en tu web.

Audítalo tú:

curl -sI https://tudominio.com/__definitivamente_no_existe

La primera línea debe ser HTTP/1.1 404 Not Found (o HTTP/2 404). Cualquier otra cosa falla la comprobación.

Preguntas frecuentes

¿Debo redirigir los 404 a la home?

No. Una redirección 301 a la home le dice a Google “esta URL se movió a /”, lo cual es mentira. El usuario ve la home y no tiene ni idea de que su URL original estaba mal; ahora la URL queda “indexada” como duplicado de la home. Devuelve siempre un 404 real.

¿Cuál es la diferencia entre 404 y 410?

404 Not Found significa “no encontramos este recurso ahora mismo”. 410 Gone significa “este recurso existía pero se eliminó permanentemente”. Google retira las URLs 410 del índice más rápido que las 404. Usa 410 para contenido borrado a propósito; 404 vale para erratas y bots probando vulnerabilidades.

Mi página 404 devuelve 200, ¿cómo lo arreglo?

Dos causas habituales: (1) tu CMS usa una ruta comodín que captura todo, incluidos los 404, y los sirve con 200; (2) tu CDN cacheó una respuesta rota inicial con estado 200. Para (1), pon explícitamente res.status(404) en el handler de “no encontrado” de tu framework. Para (2), purga la caché del CDN y verifica directamente contra el origen.

Fuentes

Última actualización 2026-05-11