technical

Servi un 404 vero, non un soft-404

MetricSpot richiede un URL casuale inesistente e controlla lo stato. I soft-404 (200 OK su una pagina "non trovata") gonfiano l'indice con URL spazzatura e confondono i crawler.

Cosa controlla questo check

Manda una richiesta a un URL randomizzato sul tuo dominio che quasi certamente non esiste (qualcosa come /__metricspot_probe_${random}). Il check fallisce quando:

  • Il server restituisce 200 OK con una pagina “non trovata” (un soft 404 — il caso peggiore).
  • Il server restituisce 5xx invece di 404.
  • Il server restituisce 200 con un redirect alla homepage (anche questo è un soft 404 agli occhi di Google).

Passa quando il server restituisce un vero 404 (o 410 Gone) con una pagina di errore utile.

Perché è importante

I soft 404 confondono i crawler e corrompono il tuo indice.

  • Index bloat. Google indicizza una pagina soft-404 come qualsiasi normale pagina 200. Un sito con un CMS buggato che restituisce 200 per i typo può finire con migliaia di URL spazzatura nell’indice.
  • Crawl budget sprecato. Googlebot rivisita gli URL soft-404 cercando nuovo contenuto, mangiandosi il crawl budget delle pagine reali.
  • Errori in Search Console. Search Console alla fine segnerà le pagine soft-404 come errori Soft 404 e smetterà di indicizzarle — ma la pulizia richiede settimane.
  • UX. Una vera pagina 404 può suggerire contenuti correlati, instradare gli utenti alla ricerca e recuperare la visita. Un 200-redirect-alla-homepage li abbandona senza alcun segnale che l’URL originale era rotto.

Come risolvere

Configura il server per restituire 404 Not Found per i path sconosciuti e renderizza una pagina utile sopra.

nginx — definisci una pagina di errore personalizzata che restituisca comunque 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 — Page not found</h1>
      <p>Try the <a href="/">homepage</a> or <a href="/search/">search</a>.</p>
    </main>
  );
}

Next.js serve automaticamente questo con un codice di stato 404.

Astro:

---
// src/pages/404.astro
---
<html>
  <head><title>404 — Not found</title></head>
  <body>
    <h1>404 — Page not found</h1>
    <a href="/">Back to home</a>
  </body>
</html>

Astro lo costruisce come un 404.html statico che nginx serve automaticamente con il codice di stato giusto.

WordPress — i temi includono un template 404.php. Se il tuo fa redirect alla home invece di restituire 404, controlla functions.php per un wp_redirect() fuori posto e rimuovilo.

Rendi la pagina utile. Un vero 404 dovrebbe:

  • Essere onesto — l’intestazione legge “Pagina non trovata”, non “Bentornato”.
  • Suggerire 3–4 pagine popolari (la nav del sito non conta; offri link specifici).
  • Includere la ricerca se ce l’hai.
  • Matchare il branding del sito così l’utente sa di essere ancora sul tuo sito.

Verifica tu stesso:

curl -sI https://yourdomain.com/__definitely_does_not_exist

La prima riga deve essere HTTP/1.1 404 Not Found (o HTTP/2 404). Qualsiasi altra cosa fallisce il check.

Domande frequenti

Dovrei fare redirect dei 404 alla homepage?

No. Un redirect 301 alla home dice a Google “questo URL è migrato a /” — che è una bugia. L’utente vede la homepage e non ha idea che il suo URL originale era sbagliato; l’URL ora è “indicizzato” come duplicato della home. Restituisci sempre un vero 404.

Qual è la differenza tra 404 e 410?

404 Not Found significa “non abbiamo trovato questa risorsa in questo momento”. 410 Gone significa “questa risorsa esisteva ma è stata rimossa permanentemente”. Google rimuove gli URL 410 dall’indice più velocemente dei 404. Usa 410 per contenuti che hai cancellato deliberatamente; 404 va bene per typo e bot che sondano vulnerabilità.

La mia pagina 404 restituisce 200 — come la sistemo?

Due cause comuni: (1) il tuo CMS usa una rotta wildcard che cattura tutto, inclusi i 404, e li serve con un 200; (2) la tua CDN ha cachato una risposta rotta in anticipo con stato 200. Per (1), imposta esplicitamente res.status(404) nell’handler not-found del framework. Per (2), svuota la cache della CDN e verifica direttamente contro l’origin.

Fonti

Ultimo aggiornamento 2026-05-11