Se il tuo sito ha versioni in più lingue o per più paesi, l’attributo hreflang è il meccanismo con cui dici a Google: “queste URL sono la stessa pagina, ciascuna per un pubblico diverso”. Senza hreflang, Google vede duplicati (stesso contenuto su URL diverse) o mostra la versione sbagliata all’utente sbagliato (es. versione inglese all’utente italiano). Con hreflang implementato bene, ogni utente vede la sua versione e il valore SEO è consolidato.
Indice contenuti:
Hreflang è anche una delle cose più frequentemente implementate male: la sintassi è pignola, gli errori silenziosi, e gli effetti visibili solo dopo settimane.
A cosa serve hreflang
Il problema che risolve: hai un sito disponibile in italiano e francese. Stesso contenuto, tradotto:
https://esempio.com/it/paginahttps://esempio.com/fr/pagina
Senza hreflang, Google ha tre problemi:
- Due URL con contenuto uguale in lingue diverse: potenziale duplicato
- Non sa quale versione mostrare all’utente italiano vs francese
- Il ranking e i link si spalmano tra entrambe in modo imprevedibile
Con hreflang, ciascuna pagina dichiara le sue alternative linguistiche:
- La pagina italiana dice “per francese vai su
/fr/pagina“ - La pagina francese dice “per italiano vai su
/it/pagina“
Google così può:
- Riconoscere che sono versioni alternative, non duplicati
- Mostrare la versione giusta in base a lingua/paese dell’utente
- Consolidare i segnali SEO a livello di “pagina logica” invece che di singola URL
Sintassi
Il codice lingua segue lo standard ISO 639-1 (due lettere). Opzionalmente, aggiungi il codice paese secondo ISO 3166-1 Alpha-2:
| Esempio | Significato |
|---|---|
it |
Lingua italiana (qualunque paese) |
en |
Lingua inglese (qualunque paese) |
en-US |
Inglese degli Stati Uniti |
en-GB |
Inglese del Regno Unito |
es-MX |
Spagnolo del Messico |
fr-CA |
Francese del Canada |
x-default |
Fallback per utenti non corrispondenti a nessuna versione |
Errori classici di codici:
en-UK→ sbagliato, il codice paese èGB(Great Britain, per ragioni storiche ISO)pt-BR→ corretto (portoghese Brasile);pt-PTper Portogallozh-CN→ semplificato (Cina);zh-TWtradizionale (Taiwan)- Il codice lingua va prima, il paese dopo, separati da trattino (non underscore)
x-default: specifica la pagina da mostrare quando nessuna delle versioni linguistiche corrisponde all’utente. Tipicamente la versione inglese o una selector page (pagina dove l’utente sceglie lingua/paese).
I tre metodi di implementazione
Hreflang può essere dichiarato in tre modi. Ne basta uno, ma deve essere fatto correttamente.
Metodo 1: tag <link> nell’HTML
Il più diffuso. In <head> di ogni pagina, elenchi tutte le versioni alternative incluso il self-reference:
<!-- In ogni pagina italiana -->
<link rel="alternate" hreflang="it" href="https://esempio.com/it/pagina" />
<link rel="alternate" hreflang="fr" href="https://esempio.com/fr/pagina" />
<link rel="alternate" hreflang="en" href="https://esempio.com/en/pagina" />
<link rel="alternate" hreflang="x-default" href="https://esempio.com/en/pagina" />
Regole inderogabili:
- Ogni pagina deve elencare tutte le sue alternative, inclusa se stessa
- Tutte le alternative devono dichiarare reciprocamente l’una l’altra (bidirezionalità)
- URL assolute, non relative
- Protocollo coerente (tutti HTTPS)
Metodo 2: header HTTP
Utile per file non HTML (PDF, documenti scaricabili):
HTTP/1.1 200 OK
Link: <https://esempio.com/it/file.pdf>; rel="alternate"; hreflang="it",
<https://esempio.com/fr/file.pdf>; rel="alternate"; hreflang="fr"
Raro nell’uso pratico, ma è l’unico modo per file non HTML.
Metodo 3: sitemap XML
Dichiarare hreflang dentro la sitemap XML:
<url>
<loc>https://esempio.com/it/pagina</loc>
<xhtml:link rel="alternate" hreflang="it" href="https://esempio.com/it/pagina"/>
<xhtml:link rel="alternate" hreflang="fr" href="https://esempio.com/fr/pagina"/>
<xhtml:link rel="alternate" hreflang="en" href="https://esempio.com/en/pagina"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://esempio.com/en/pagina"/>
</url>
<url>
<loc>https://esempio.com/fr/pagina</loc>
<xhtml:link rel="alternate" hreflang="it" href="https://esempio.com/it/pagina"/>
<xhtml:link rel="alternate" hreflang="fr" href="https://esempio.com/fr/pagina"/>
<xhtml:link rel="alternate" hreflang="en" href="https://esempio.com/en/pagina"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://esempio.com/en/pagina"/>
</url>
Vantaggi rispetto al metodo HTML:
- Più scalabile per siti con molte pagine e molte lingue
- Modifiche centralizzate
- Non pesa sul rendering delle pagine
Svantaggi:
- Dipende dalla sitemap: se non viene processata, hreflang non viene letto
- Più complesso da gestire manualmente (plugin SEO la gestiscono automaticamente)
Quale scegliere? Per siti piccoli con 2-4 lingue: tag HTML. Per siti grandi o multi-regionali con molte combinazioni: sitemap XML.
Strutture URL possibili
Tre approcci per organizzare le versioni linguistiche:
ccTLD (domini separati per paese)
esempio.it
esempio.fr
esempio.de
Pro: segnale geografico fortissimo, ogni dominio guadagna autorità autonoma Contro: costoso (dominio per ogni paese), gestione SEO separata, link equity non si consolida
Quando ha senso: business grandi con presenza forte e differenziata in ciascun paese (Amazon, IKEA).
Sottodomini
it.esempio.com
fr.esempio.com
de.esempio.com
Pro: separazione chiara tra versioni Contro: Google tratta i sottodomini come “quasi domini separati”, autorità non perfettamente condivisa
Quando ha senso: raramente la prima scelta. Più usato per motivi tecnici (diversi server, diversi CMS per paese).
Sottocartelle
esempio.com/it/
esempio.com/fr/
esempio.com/de/
Pro: un solo dominio, tutta l’autorità consolidata, facile da gestire Contro: segnale geografico più debole rispetto a ccTLD
Quando ha senso: default nel 99% dei casi. Miglior rapporto sforzo/risultato.
Parametri URL: NO
esempio.com/pagina?lang=it
esempio.com/pagina?lang=fr
Da evitare sempre. Genera potenziali duplicati, problemi di canonical, URL non SEO-friendly.
Errori tipici
1. Self-reference mancante. Ogni pagina deve dichiarare anche se stessa nell’elenco hreflang. Se la pagina /it/pagina non ha <link rel="alternate" hreflang="it" href="/it/pagina">, il set è considerato incompleto.
2. Bidirezionalità rotta. /it/pagina dichiara /fr/pagina come alternativa, ma /fr/pagina non dichiara /it/pagina. Google richiede la conferma reciproca: se manca, ignora l’hreflang.
3. Canonical e hreflang in conflitto. /it/pagina ha canonical → /en/pagina. Contraddizione: “questa è versione italiana” + “la canonica è la inglese”. Google si confonde, tipicamente ignora tutto.
Regola: ogni versione linguistica deve avere canonical autoreferenziale (o a se stessa). Il canonical non sostituisce hreflang.
4. Link a URL con redirect o 404. Hreflang che puntano a URL che non esistono più o redirigono altrove. Google controlla, se trova problemi ignora il set.
5. Codici lingua errati. en-UK invece di en-GB. pt senza distinzione tra Brasile e Portogallo quando sono versioni diverse. it-IT tecnicamente ridondante (l’italiano di default è già italiano).
6. Solo nella home page. Alcune implementazioni mettono hreflang solo sulla homepage. Deve essere su ogni pagina che ha versioni multilingua. La homepage parla solo per se stessa.
7. Contenuto non tradotto. Se la “versione italiana” è la stessa pagina inglese, Google lo riconosce e ignora l’hreflang (considerandola duplicato). Hreflang funziona solo con contenuto effettivamente in quella lingua.
Come verificare l’implementazione
Search Console → Esperienza multilingua (se disponibile): report dedicato che mostra errori hreflang rilevati. Aggiornato, utilizzabile.
Tool esterni di validazione:
- Screaming Frog: in modalità crawl include un report hreflang completo, mostra errori di bidirezionalità e self-reference
- Hreflang.org checker: validatore singola URL
- Merkle Hreflang Tester: tool online gratuito
Controlli manuali spot-check: Su qualche pagina, dopo il deploy:
- Apri il sorgente HTML
- Verifica che hreflang sia presente
- Verifica self-reference
- Controlla una URL alternata: ha anche lei l’hreflang verso l’originale?
Hreflang + canonical: la combinazione corretta
Sintesi della configurazione che funziona sempre:
<!-- Pagina italiana /it/pagina -->
<link rel="canonical" href="https://esempio.com/it/pagina" />
<link rel="alternate" hreflang="it" href="https://esempio.com/it/pagina" />
<link rel="alternate" hreflang="fr" href="https://esempio.com/fr/pagina" />
<link rel="alternate" hreflang="en" href="https://esempio.com/en/pagina" />
<link rel="alternate" hreflang="x-default" href="https://esempio.com/en/pagina" />
<!-- Pagina francese /fr/pagina -->
<link rel="canonical" href="https://esempio.com/fr/pagina" />
<link rel="alternate" hreflang="it" href="https://esempio.com/it/pagina" />
<link rel="alternate" hreflang="fr" href="https://esempio.com/fr/pagina" />
<link rel="alternate" hreflang="en" href="https://esempio.com/en/pagina" />
<link rel="alternate" hreflang="x-default" href="https://esempio.com/en/pagina" />
Ogni pagina è canonica di sé stessa, ogni pagina elenca tutte le alternative (inclusa sé stessa), tutte le pagine dichiarano lo stesso set.
Takeaway
- Hreflang non è un fattore di ranking diretto: serve per mostrare la versione giusta all’utente giusto e consolidare i segnali
- Self-reference e bidirezionalità sono obbligatorie: un errore qui fa ignorare l’intero set
- Canonical autoreferenziale su ogni versione; niente canonical cross-lingua
- Struttura URL raccomandata: sottocartelle (
/it/,/fr/) come default - Per siti piccoli: tag HTML. Per siti grandi con molte combinazioni: sitemap XML
- Hreflang funziona solo se il contenuto è davvero tradotto: copiare la pagina inglese e cambiare la url non basta
