Pagina 404 personalizzata: come configurarla correttamente

La pagina 404 è la prima cosa che un utente vede dopo un link rotto. Come restituire l'HTTP 404, evitare i soft 404 e configurare la pagina in Next.js, Nginx e Apache — con codice e checklist.

Quando un utente segue un link rotto, il server deve restituire lo status 404 Not Found. Ma nei progetti reali questa regola viene violata sorprendentemente spesso: la CMS restituisce 200 OK, un redirect porta alla homepage, oppure la pagina «404» tecnicamente restituisce il codice giusto ma sembra uno schermo vuoto. Ognuna di queste situazioni è un problema distinto sia per la SEO sia per l'utente.

Una pagina 404 configurata correttamente risolve tre problemi in una volta: segnala a Google che l'URL non esiste; tiene l'utente sul sito e lo aiuta a trovare la sezione giusta; e protegge il crawl budget da passaggi sprecati. Vediamo ogni aspetto in ordine.

Google non penalizza i siti per la presenza di pagine 404. I problemi non vengono dal codice 404 in sé, ma da un'implementazione sbagliata: quando il 404 restituisce 200 OK, quando i link interni puntano a URL in 404, o quando migliaia di pagine vengono eliminate senza redirect 301.

Cos'è una pagina 404

404 Not Found è il codice di risposta HTTP che un server restituisce quando la risorsa richiesta non esiste. Il codice significa che il server funziona bene e la rotta è stata risolta, ma il documento richiesto è assente. Questo distingue il 404 dal 500 (errore del server) e dal 503 (servizio non disponibile).

~74%

Siti senza una 404 personalizzata

La maggior parte dei siti mostra la 404 di default della piattaforma invece di una pagina brandizzata con navigazione

Settimane

Tempo di deindicizzazione

Google in genere rimuove dall'indice un 404 corretto entro poche settimane. Acceleri via Search Console

Soft 404

Errore più comune

La CMS restituisce 200 OK invece di 404 — Google indicizza pagine vuote e diluisce la focalizzazione tematica del sito

410

Deindicizzato più in fretta

Google rimuove il 410 (Gone) dall'indice nettamente più velocemente del 404 — usalo per eliminazioni di pagine in blocco

Una pagina 404 esiste su due livelli. Il livello HTTP è il codice di risposta nell'header che il crawler vede. Il livello visivo è il contenuto HTML che l'utente vede. Entrambi contano allo stesso modo: un codice HTTP sbagliato è un problema SEO; un design visivo scadente è un problema UX.

La regola principale: restituire sempre HTTP 404

La prima e più importante regola: una pagina di errore deve restituire lo status HTTP 404 (o 410) — mai 200. Si chiama «hard 404» in contrapposizione al «soft 404».

Errore critico: restituire HTML con il messaggio «Pagina non trovata» sotto lo status HTTP 200 OK. Google vede una risposta «riuscita» e mette in coda la pagina per l'indicizzazione. Risultato: nell'indice compaiono centinaia di URL privi di senso con contenuti identici.

Puoi controllare lo status HTTP di qualsiasi pagina direttamente nel browser: F12 → Network → ricarica la pagina → trova la prima richiesta → colonna Status. Oppure via curl nel terminale:

bash
# Check HTTP status of a page
curl -s -o /dev/null -w "%{http_code}" https://example.com/non-existent-url
# Expected output: 404

# Check full response headers
curl -I https://example.com/non-existent-url
Controllo rapido nel browser: apri DevTools (F12) → scheda Network → vai alla pagina 404 → guarda la colonna Status della prima richiesta. Deve mostrare 404, non 200.

Soft 404 e 410: la differenza

Oltre all'«hard 404» esistono due casi correlati spesso confusi nella pratica: il soft 404 e lo status 410. Capirne la differenza è importante per gestire correttamente le pagine eliminate.

StatusCodice HTTPCosa significa per GoogleQuando usarlo
Hard 404404Risorsa non trovata; Google la rimuove dall'indice entro poche settimanePagina eliminata o mai esistita
Soft 404200 (errore!)Google vede una risposta «riuscita» e indicizza contenuti vuotiMai — è un bug di implementazione, non una scelta intenzionale
Gone410Risorsa eliminata definitivamente; Google deindicizza molto più in fretta che col 404Eliminazione di pagine in blocco (vecchi prodotti, sezioni obsolete)
Il soft 404 non è una scelta deliberata dello sviluppatore — è un bug. Avviene il più delle volte in WordPress e altre CMS dove il template 404 è incorporato nel layout principale, che restituisce sempre 200. Controlla subito la tua pagina 404 con curl o DevTools.

Google classifica come soft 404 anche qualsiasi redirect da un URL in 404 verso la homepage o un'altra pagina irrilevante. Dal punto di vista del motore di ricerca: l'utente cercava A, è finito su B, e il contenuto di B non risponde alla query. Questo degrada il segnale di qualità della pagina di destinazione.

Cosa deve contenere una buona pagina 404

Un utente che arriva su una 404 è già leggermente frustrato. Il compito della pagina è attenuare quella frustrazione e dare alla persona un prossimo passo chiaro. Una 404 efficace segue una struttura riconoscibile.

Come una pagina 404 personalizzata tiene gli utenti sul sito.

Messaggio di errore chiaro

Spiega la situazione in linguaggio semplice: «Pagina non trovata» o «Questa pagina sembra non esistere». Evita gergo tecnico e codici di errore nel testo visibile.

Casella di ricerca

L'elemento più efficace in assoluto su una pagina 404. L'utente sa già cosa cerca — dagli la possibilità di trovarlo subito qui, senza tornare su Google.

Navigazione verso le sezioni chiave

Link alla homepage, alle sezioni popolari o alla sitemap. Aiutano gli utenti a orientarsi e a continuare il percorso nel sito.

Pulsante Indietro

Molti utenti vogliono tornare da dove sono arrivati. Un link o pulsante Indietro riduce la frequenza di rimbalzo e migliora la UX.

La soluzione più efficace per l'e-commerce: mostra prodotti o categorie popolari nella pagina 404. Un utente che ha seguito un link rotto verso un prodotto specifico è molto probabilmente interessato a quella categoria.

Cosa non fare su una pagina 404: reindirizzare automaticamente l'utente alla homepage via JavaScript (window.location.href = '/'). Google può trattarlo come soft 404 — l'utente si aspettava A, ha ricevuto B, il contenuto è irrilevante. I redirect 301 a livello server da URL in 404 sono appropriati solo quando esiste una vera pagina sostitutiva.

Implementazione: Next.js, Nginx, Apache

Come configuri una pagina 404 personalizzata dipende dal tuo stack. Vediamo le tre configurazioni più comuni: Next.js App Router, Nginx e Apache.

Next.js App Router

In Next.js 13+ con App Router, una pagina 404 personalizzata si crea con un file not-found.tsx dentro la directory app/. Per l'i18n (es. con next-intl) il file vive in app/[locale]/.

tsx
// app/[locale]/not-found.tsx
import Link from 'next/link';

export default function NotFound() {
  return (
    <main style={{ textAlign: 'center', padding: '4rem 1rem' }}>
      <h1>404 — Page Not Found</h1>
      <p>The link may be outdated or the address was mistyped.</p>
      <Link href="/">Back to homepage</Link>
    </main>
  );
}

// Next.js automatically returns HTTP 404 for this file.

Per generare un 404 programmatico (es. in una rotta dinamica app/[locale]/blog/[slug]/page.tsx), usa la funzione notFound() da next/navigation. Chiamandola, il rendering si interrompe subito e viene restituito l'HTTP 404 + renderizzato not-found.tsx.

tsx
// app/[locale]/blog/[slug]/page.tsx
import { notFound } from 'next/navigation';
import { getArticleDoc } from '@/messages/blog-articles/registry';

export default async function ArticlePage({ params }: { params: { slug: string } }) {
  const article = getArticleDoc(params.slug);

  // If slug does not exist — return HTTP 404 and render not-found.tsx
  if (!article) {
    notFound();
  }

  return <ArticleRenderer article={article} />;
}
Nel Pages Router (Next.js <13), la pagina 404 personalizzata è diversa: crea pages/404.tsx. Next.js ci instrada automaticamente e restituisce l'HTTP 404. La funzione notFound() non è disponibile nel Pages Router — usa invece { notFound: true } in getStaticProps o getServerSideProps.
tsx
// Pages Router: pages/blog/[slug].tsx (legacy approach)
export async function getServerSideProps({ params }) {
  const article = getArticleDoc(params.slug);

  if (!article) {
    // Next.js will return HTTP 404 and show pages/404.tsx
    return { notFound: true };
  }

  return { props: { article } };
}

Nginx

In Nginx, una pagina 404 personalizzata si configura con la direttiva error_page dentro il blocco server. Assicurati che il file 404.html esista al percorso indicato e che servirlo non inneschi un redirect interno a 200.

nginx
server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Custom page for 404 errors
    error_page 404 /404.html;

    # The location for the file itself — returns 404, not 200
    location = /404.html {
        internal;
    }

    # Custom pages for other errors
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        internal;
    }
}
La direttiva internal blocca l'accesso esterno diretto a /404.html — la pagina è accessibile solo come risposta di errore. Senza, gli utenti potrebbero aprire /404.html direttamente ricevendo un 200, creando un duplicato di contenuto.

Apache / .htaccess

Per Apache, la 404 personalizzata si configura via ErrorDocument — nella config principale o in .htaccess.

apache
# .htaccess in the site root

# Custom 404 page
ErrorDocument 404 /404.html

# You can also point to a PHP file
# ErrorDocument 404 /404.php

# Custom pages for other errors
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html

# Enable mod_rewrite for SPA routing
<IfModule mod_rewrite.c>
    RewriteEngine On
    # For React/Vue SPA: all non-existent routes → index.html
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ /index.html [L]
</IfModule>
Attento al routing SPA in Apache e Nginx: servire tutte le rotte 404 come index.html con codice 200 porta i motori a indicizzare pagine inesistenti. O la SPA aggiunge lato client <meta name="robots" content="[noindex](/glossary/noindex)"> alle pagine 404, oppure usi SSR/SSG con codici di stato HTTP corretti.

PHP (WordPress e altre CMS)

In WordPress, la pagina 404 personalizzata è il file 404.php del tuo tema. WordPress restituisce automaticamente l'HTTP 404 per gli URL inesistenti quando i permalink sono configurati correttamente. Se la CMS restituisce 200 invece di 404, il problema è di solito nel .htaccess o nella configurazione del server.

php
<?php
// themes/your-theme/404.php
// WordPress automatically returns HTTP 404
get_header();
?>
<main class="error-404">
    <h1>Page Not Found</h1>
    <p>Try using search:</p>
    <?php get_search_form(); ?>
    <p>Or return to the <a href="<?php echo home_url(); ?>">homepage</a>.</p>
</main>
<?php
get_footer();

Una pagina 404 configurata bene è solo metà del lavoro. L'altra metà è trovare tutti i link che puntano a pagine inesistenti e risolverli. I link rotti sono la causa principale degli errori 404 nell'indice.

Passo 1Trovali con Google Search Console

Search Console → Indicizzazione → Pagine → «Non trovato (404)». È la fonte gratuita e più completa: Google mostra solo i 404 scoperti durante la scansione — esattamente quelli che contano per la SEO.

Passo 2Scansiona il sito con Screaming Frog

Esegui un crawl del sito in Screaming Frog SEO Spider. Filtro: Response Codes → 4xx. Lo strumento mostra non solo gli URL in 404 ma anche le pagine sorgente — esattamente quali pagine contengono link rotti.

Passo 3Controlla i log del server

I log contengono il 100% delle richieste, incluse quelle che Google non ha ancora scoperto. Filtro: grep ' 404 ' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20 — i top 20 URL che restituiscono 404.

Passo 4Correggi o imposta redirect

Per ogni 404 trovato, la decisione è una di tre: imposta un 301 verso l'URL sostitutivo pertinente (se esiste una pagina simile), rimuovi tutti i link interni che vi puntano, o lascia il 404 com'è (se nessun link vi punta — Google lo rimuoverà dall'indice da solo).

Esempio di implementazione del codice per la pagina 404:
bash
# Find top-20 broken URLs in Nginx/Apache logs
grep ' 404 ' /var/log/nginx/access.log \
  | awk '{print $7}' \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -20

# Example output:
# 143 /old-product-page
#  87 /blog/removed-article
#  34 /wp-login.php  (attack attempts — not critical)
Non impostare redirect 301 da tutti gli URL in 404 verso la homepage — si chiama «redirect chain to homepage» e Google lo tratta come soft 404. Un redirect è giustificato solo quando la pagina di destinazione è tematicamente vicina a quella eliminata. Se non c'è un sostituto — la risposta giusta è un 404 corretto.

Monitorare gli errori 404

Un audit una tantum va bene. Ma nuovi 404 compaiono in continuazione: pagine rinominate, prodotti eliminati, siti esterni che linkano URL inesistenti. È importante configurare un monitoraggio regolare.

StrumentoCosa monitoraFrequenzaGratis
Google Search ConsoleI 404 scoperti da Googlebot durante la scansioneAggiornato ogni giornoSì
Screaming Frog + schedulerTutti i 404 durante un crawl completo del sitoSettimanale/mensileFino a 500 URL
Log del server (goaccess, awstats)Tutti i 404 in tempo reale da access.logTempo realeSì
Ahrefs / Semrush Site Audit404 + link esterni in entrata che puntano a 404Settimanale automaticoA pagamento
UptimeRobot / Better UptimeMonitoraggio uptime degli URL chiaveOgni 1–5 minutiPiano base gratuito

Per i siti grandi (10.000+ pagine) i log del server sono particolarmente preziosi: coprono il 100% delle richieste, inclusi bot, utenti e script. Search Console mostra solo ciò che Googlebot ha trovato scansionando — un sottoinsieme del quadro completo.

Configura gli avvisi in Google Search Console: Impostazioni → Notifiche email. GSC invierà una notifica se il numero di 404 schizza — per esempio dopo un deploy che ha rotto il routing per errore.

Checklist della pagina 404 corretta

Status HTTP

  • La pagina 404 restituisce lo status HTTP 404 (verificato con curl o DevTools)
  • Nessun soft 404: la pagina con il messaggio di errore non restituisce 200 OK
  • Nessun redirect JavaScript da URL inesistenti verso la homepage
  • Il 410 Gone è usato per le pagine eliminate in blocco senza sostituto
  • I redirect 301 sono configurati solo per gli URL con una pagina sostitutiva pertinente

Contenuto della pagina

  • Messaggio di errore chiaro, in linguaggio semplice, senza gergo tecnico
  • Presente una casella di ricerca o un link alla ricerca del sito
  • Presente un link alla homepage
  • Presenti link a 2–4 sezioni o categorie popolari
  • La pagina è coerente col brand del sito (header, footer, font)

Implementazione

  • Next.js: file not-found.tsx creato; notFound() viene chiamato per slug inesistenti
  • Nginx: direttiva error_page 404 configurata; il file 404.html è marcato come internal
  • Apache: ErrorDocument 404 impostato in .htaccess o nella config principale
  • WordPress: 404.php esiste nel tema attivo
  • SPA (React/Vue senza SSR): meta tag noindex aggiunto lato client sulle pagine 404

Monitoraggio

  • Google Search Console collegato e avvisi email configurati
  • Crawl regolare con Screaming Frog o equivalente (almeno mensile)
  • Log del server accessibili e analizzati per i siti ad alto traffico
  • Tutti i link interni che puntavano a URL in 404 sono stati trovati e corretti
Controlla subito la tua pagina 404: vai su tuodominio.com/test-404-check (un URL inesistente), apri DevTools → Network, trova la prima richiesta, guarda lo status. Se mostra 200 — hai un soft 404 e devi correggere la configurazione del server.

FAQ

Risposte alle domande comuni sulla configurazione delle pagine 404 che emergono durante audit e sviluppo.

Devo aggiungere un tag noindex alla pagina 404?
No. Una pagina che restituisce l'HTTP 404 non verrà indicizzata da Google — indipendentemente dalla presenza di noindex. Google semplicemente non la aggiungerà all'indice. Se restituisci 200 OK con noindex, Google può elaborare temporaneamente la pagina come indicizzabile prima di ripensarci. Il codice HTTP corretto conta più di qualsiasi meta tag.
Cosa fare se una pagina che si posizionava su Google ora restituisce 404?
Google la rimuoverà dall'indice da solo — di norma entro 1–4 settimane dalla nuova visita di Googlebot all'URL. Per accelerare la rimozione: Search Console → strumento Rimozione URL. Se esiste una pagina sostitutiva tematicamente vicina — imposta un redirect 301: trasmette il valore dei link e aggiorna le posizioni più in fretta.
Una pagina 404 può essere bella e brandizzata?
Deve esserlo. Una 404 brandizzata con navigazione tiene gli utenti sul sito e riduce la frequenza di rimbalzo. Restituire l'HTTP 404 nell'header non impedisce alla pagina di essere accattivante visivamente. La chiave è restituire il codice HTTP corretto e dare all'utente un prossimo passo chiaro.
La pagina 404 deve essere uguale per tutti gli URL inesistenti?
Per la maggior parte dei siti — sì, una pagina 404 universale va bene. Per l'e-commerce puoi aggiungere personalizzazione: rileva dal pattern dell'URL da quale categoria arrivava l'utente e mostra prodotti pertinenti. Ma questa complessità è giustificata solo quando le pagine 404 ricevono traffico significativo.
Cos'è il crawl budget e come lo consuma il 404?
Il crawl budget è il numero di pagine che Googlebot è disposto a scansionare sul tuo sito in un dato periodo. Se i link interni puntano a URL in 404, il bot ritornerà ripetutamente su quegli indirizzi morti invece di scansionare pagine vive. Per i siti con milioni di URL è critico: rimuovi tutti i link interni che puntano a 404.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it