Errori soft 404: cosa sono e come correggerli
Risposta breve: un soft 404 è una pagina che dice al visitatore «non trovata» (o non mostra quasi niente), ma risponde con il codice di successo 200 invece che con 404. Google lo tratta come un errore: quando una risposta 2xx ha un contenuto che indica un errore, Search Console segnala un soft 404. Si risolve facendo inviare al server il codice di stato che corrisponde alla verità: 404 o 410 per le pagine che non esistono più, un 301 verso una pagina equivalente per quelle spostate e contenuto vero per quelle che devono esistere.
Che cos’è un soft 404?
Ogni risposta di un server web comincia con un codice di stato, e il codice viene prima di qualsiasi contenuto. 200 significa «va bene, ecco la pagina». 404 significa «qui non c’è niente». Un soft 404 è una discordanza tra i due: la pagina sullo schermo dice «non trovata», «0 risultati» oppure non mostra nulla che valga la pena leggere, eppure lo stato è 200.
Google descrive il caso nella documentazione su codici di stato HTTP ed errori di rete. Per una risposta 2xx Google tiene conto del contenuto. Se il contenuto indica un errore, per esempio una pagina vuota o un messaggio di errore, Search Console mostra un errore soft 404. Con un vero stato 4xx, invece, Google non usa affatto il contenuto dell’URL.
La differenza si vede in un terminale. Su un sito con questo problema, una richiesta a un indirizzo che non esiste si presenta così (l’indirizzo è un segnaposto):
$ curl -s -o /dev/null -w "%{http_code}\n" https://tuo-sito.example/pagina-inesistente
200
La risposta corretta è 404. Il visitatore vede lo stesso cordiale testo «Pagina non trovata» in entrambi i casi. Cambia solo lo stato, e lo stato è la prima cosa che un crawler legge.
Il «soft» (morbido) non significa «lieve». Significa che il server dice che va tutto bene mentre la pagina dice di no.
Perché un soft 404 è un problema?
Ecco che cosa è documentato e che cosa no.
Documentato:
- Search Console elenca l’URL come errore soft 404, quindi è Google stesso a considerarlo un problema.
- Con un vero 404 o 410 Google non usa il contenuto dell’URL. Con un 200 lasci a Google il compito di indovinare, dal contenuto, se la pagina è un errore.
Non documentato: un effetto diretto sul posizionamento. Google nomina l’errore nel suo report. Non dice che un soft 404 faccia calare altre pagine del tuo sito, e non abbiamo trovato alcuna fonte che lo dimostri. Diffida di affermazioni come «i soft 404 distruggono la tua SEO».
La nostra valutazione, e niente di più: una pagina senza valore non dovrebbe essere proposta come risultato, e la correzione costa poco. C’è anche un lato pratico che con Google non c’entra: i controlli dei link e i servizi di monitoraggio leggono i codici di stato. Se ogni indirizzo risponde 200, non possono dirti che un link è rotto, e i visitatori che seguono un vecchio link non vengono mai avvisati che la pagina non c’è più.
Quali sono le cause di un soft 404?
I soft 404 nascono tipicamente da situazioni come queste:
- Una single-page app che risponde a ogni percorso con lo stesso guscio. Il server invia l’app, con stato 200, per qualsiasi indirizzo. Solo dopo l’esecuzione di JavaScript lo schermo dice «non trovata». Lo stato era già deciso prima, ed è 200. Google elabora queste pagine in fasi (scansione, rendering, indicizzazione) e una pagina con stato 200 entra nella coda per il rendering. Le basi di JavaScript di Google spiegano il modello.
- Una bella pagina di errore con stato 200. Un CMS, un framework o una regola del proxy produce un template «non trovata» ben disegnato, ma dimentica di impostare lo stato.
- Pagine di elenco vuote. Una categoria, un tag o una pagina di ricerca interna senza voci risponde comunque 200 e mostra «0 risultati» o una cornice vuota.
- Prodotti esauriti o fuori produzione. La pagina resta online con poco più di un «non disponibile». Una pagina che conserva una vera descrizione e un’indicazione sulla disponibilità è un caso diverso da un avviso nudo e crudo.
- Reindirizzare tutto alla home page. Una pagina cancellata che manda i visitatori alla pagina iniziale finisce in un 200 con un contenuto che non c’entra. La home page raramente è l’equivalente della pagina che non c’è più.
Un’altra causa è la pagina scarna: un template con pochissimo contenuto, come un segnaposto o una sezione lasciata a metà. Un contenuto che sembra un messaggio di errore o una pagina vuota può essere segnalato anche se nessuno voleva una pagina di errore.
Come si trovano gli errori soft 404?
Hai tre strade, e si completano a vicenda.
- Search Console. Apri il report sull’indicizzazione delle pagine (in inglese «Page indexing»; nel menu si trova sotto «Indicizzazione», alla voce «Pagine») e cerca il motivo «Soft 404». Elenca gli URL che Google stesso ha messo in questa categoria. Lo strumento «Controllo URL» mostra che cosa riceve Google da un singolo indirizzo.
- Un terminale. Richiedi un indirizzo che non può esistere e leggi lo stato (comando qui sotto).
- Il browser. Apri gli strumenti per sviluppatori, passa alla scheda «Rete» (in inglese Network), carica un indirizzo inventato e guarda lo stato della prima richiesta. La pagina in sé non ti dice nulla, perché ha lo stesso aspetto con qualsiasi stato.
Per il controllo da terminale, l’opzione -L segue i reindirizzamenti, così vedi anche dove finisce un indirizzo:
curl -s -L -o /dev/null -w "%{http_code} %{url_effective}\n" https://tuo-sito.example/pagina-inesistente
Il risultato che vuoi è 404. Se ottieni 200 https://example.com/, il server reindirizza gli indirizzi sconosciuti alla home page. Usa GET come qui e non curl -I, perché alcuni server rispondono in modo diverso a una richiesta HEAD.
Prova dall’esterno: richiedi l’indirizzo pubblico, non direttamente l’applicazione. Una CDN, una cache o un firewall davanti all’applicazione possono cambiare la risposta.
Come SEOgrinder verifica un soft 404
L’analisi gratuita di SEOgrinder chiede al tuo sito un indirizzo che si inventa, con un nome casuale che non può esistere. Se la risposta è 200, segnala un rilievo. Un reindirizzamento da quell’indirizzo alla tua home page conta come lo stesso rilievo, perché finisce anch’esso in un 200. Il risultato compare nella scheda «Pagina su Google», nel riquadro «Indicizzazione», come una riga: «Gli indirizzi sconosciuti restituiscono correttamente 404» oppure «Gli indirizzi sconosciuti restituiscono 200 invece di 404». Il rilievo entra nell’elenco delle attività con il consiglio di restituire un vero 404 o 410.
Due limiti, detti onestamente. Primo: questo test verifica come il tuo server tratta gli indirizzi che non esistono. Non ti dice quali dei tuoi URL reali Google ha classificato come soft 404. Per i singoli URL il verdetto sta in Search Console. In un’installazione locale collegata a Search Console, SEOgrinder legge anche lo stato di indicizzazione salvato della pagina analizzata e lo segnala quando Google la elenca come soft 404. Secondo: il test non può dirti se una tua pagina scarna appaia vuota a Google. La scansione del sito segnala le pagine scarne e i link interni rotti, che sono i punti in cui il problema spesso comincia.
Quale codice di stato è giusto? Una tabella decisionale
La risposta giusta dipende da ciò che è vero per la pagina. Adatta lo stato alla verità, non il contrario.
| Situazione | Risposta giusta | Nota |
|---|---|---|
| La pagina non esiste più e non ha equivalenti | 404 o 410 | Una pagina di errore ben disegnata va bene, ma deve inviare lo stato di errore |
| La pagina si è spostata a un nuovo indirizzo | 301 (o 308) verso la nuova pagina equivalente | Un segnale forte che Google debba elaborare la destinazione |
| Lo spostamento è davvero temporaneo | 302 (o 307) | Un segnale debole, quindi non per gli spostamenti permanenti |
| La pagina esiste ma è scarna o quasi vuota | Aggiungi contenuto vero | Oppure rimuovila, se non ha uno scopo |
| Una pagina di elenco o di ricerca è vuota in modo permanente | 404 | Non proporla nei link né nella sitemap |
| Una pagina di elenco vuota per ora | Mostra qualcosa di utile | Per esempio voci correlate e un avviso, con stato 200 |
| Un prodotto definitivamente fuori catalogo | 404 o 410, oppure un 301 verso il suo successore diretto | Non verso la home page |
| Un prodotto esaurito per un po’ | Conserva la pagina con il suo contenuto reale | Qui lo stato 200 è corretto |
Google considera 301 e 308 un segnale forte che la destinazione del reindirizzamento vada elaborata, e 302 e 307 un segnale debole. Per impostazione predefinita segue fino a dieci passaggi di reindirizzamento e ignora il contenuto dell’URL che reindirizza. Quindi reindirizza una volta sola, direttamente all’indirizzo finale.
Come correggere un soft 404 in nginx, Node e nelle single-page app
nginx
Questa configurazione serve una pagina di errore ben disegnata e mantiene lo stato 404. La riga error_page 404 /404.html; conserva lo stato originale a meno che tu non aggiunga =200, quindi non aggiungerlo.
server {
root /var/www/example;
error_page 404 /404.html;
location / {
try_files $uri $uri/ =404;
}
location = /404.html {
internal;
}
# rimossa di proposito
location /vecchia-campagna/ {
return 410;
}
# spostata
location = /vecchia-pagina {
return 301 https://example.com/nuova-pagina;
}
}
Node
Per le rotte con dati, il codice deve prima cercare il record e solo dopo decidere lo stato. Questo esempio usa soltanto i moduli di Node:
import http from 'node:http';
const products = new Map([['tazza-blu', 'Tazza blu']]); // al posto del tuo database
http.createServer((req, res) => {
const { pathname } = new URL(req.url, 'http://localhost');
const match = /^\/prodotti\/([a-z0-9-]+)$/.exec(pathname);
const name = match && products.get(match[1]);
res.writeHead(name ? 200 : 404, { 'content-type': 'text/html; charset=utf-8' });
res.end(name ? `<h1>${name}</h1>` : '<h1>Pagina non trovata</h1>');
}).listen(3000);
La pagina di errore può essere cordiale e curata nel design, e lo stato resta comunque 404. La maggior parte dei framework ha una funzione o un hook «non trovato» per lo stesso scopo. Cerca quello che imposta lo stato e non si limita a produrre un template.
Single-page app
Il server deve sapere quali percorsi esistono davvero. La scorciatoia diffusa, «invia index.html per tutto», è proprio ciò che crea il problema. In nginx puoi elencare le rotte vere e rispondere 404 a tutto il resto:
location = / {
try_files /index.html =404;
}
location ~ ^/(chi-siamo|contatti|docs)/?$ {
try_files /index.html =404;
}
location / {
try_files $uri =404;
}
Risorse come script e immagini vengono trovate dall’ultimo blocco, e ogni altro percorso riceve un 404. Se l’elenco delle rotte è lungo o cambia spesso, generalo dal tuo router in fase di build. L’alternativa è generare pagine vere sul server o in anticipo, così che ogni indirizzo abbia il proprio file HTML e il server possa rispondere per lui. Google stesso definisce il rendering lato server o il pre-rendering una buona idea, perché rende la pagina più veloce per utenti e crawler e perché non tutti i bot eseguono JavaScript. Per le app in cui impostare un codice di stato è impossibile o poco pratico, le basi di JavaScript di Google indicano altre due strade: reindirizzare con JavaScript a un indirizzo che risponde 404 (per esempio /not-found), oppure aggiungere con JavaScript <meta name="robots" content="noindex"> sulle pagine di errore.
Dopo ogni modifica ripeti il controllo con curl e prova una pagina vera, una pagina spostata e un indirizzo che non può esistere.
Errori comuni
- Correggere l’aspetto e non lo stato. Una bella pagina «non trovata» che invia 200 resta un soft 404.
- Reindirizzare tutte le pagine mancanti alla home page. Nasconde il problema ai tuoi stessi strumenti e dà ai visitatori qualcosa di diverso da ciò che cercavano. Reindirizza a una pagina equivalente, oppure rispondi 404.
error_page 404 =200 /index.html;e scorciatoie simili. Portano a 200 lo stato di ogni indirizzo sconosciuto.- Provare solo nel browser. Il browser ha lo stesso aspetto con qualsiasi stato. Leggi lo stato.
- Bloccare gli indirizzi nel robots.txt invece di correggere lo stato. Un crawler a cui non è permesso richiamare una pagina non vede mai il suo codice di stato.
- Lasciare indirizzi morti nella sitemap. Una sitemap dovrebbe elencare solo pagine che esistono e rispondono 200.
- Aspettarsi che il report si svuoti subito. La voce in Search Console cambia quando Google richiama di nuovo l’URL. Nessuno può promettere quando succederà.
Domande frequenti
Un soft 404 danneggia il mio posizionamento?
Non è dimostrato. Google lo segnala come errore in Search Console, ed è documentato. Una penalizzazione diretta per il resto del tuo sito non è documentata in nessuna delle fonti che abbiamo usato. La lettura sensata è: correggilo perché è una risposta sbagliata, non per un vantaggio promesso.
Un soft 404 è la stessa cosa di un 404?
No. Un 404 è una risposta onesta: lo stato dice che la pagina non esiste. Un soft 404 dice 200 mentre il contenuto dice il contrario.
Devo inviare 404 o 410?
Sono entrambi stati di errore 4xx, e per nessuno dei due Google usa il contenuto dell’URL. 404 è la risposta consueta per «non trovata». 410 dice «non c’è più», quindi si adatta alle pagine che hai rimosso di proposito.
Posso avere una pagina 404 personalizzata?
Sì, anzi dovresti. Disegnala come preferisci, aggiungi un link alla home page o una ricerca, ma assicurati che lo stato sia 404.
Come controllo l’intero sito?
Esegui l’analisi gratuita per verificare come risponde il tuo server agli indirizzi sconosciuti e guarda nel report di Search Console gli URL segnalati da Google. Controlla a mano un’altra cosa: le pagine che contengono soltanto un breve avviso.
Il prossimo passo
Esegui curl su un indirizzo che non può esistere nel tuo sito. Se non ottieni 404, correggi prima questo. Poi avvia l’analisi gratuita con SEOgrinder, trova la riga sul soft 404 nel riquadro «Indicizzazione» della scheda «Pagina su Google» e premi «Ricontrolla» dopo la modifica per vedere il nuovo risultato.