Hreflang è un attributo HTML che dice ai motori di ricerca quale versione linguistica e regionale di una pagina mostrare agli utenti nei diversi paesi. Senza hreflang, Google può mostrare la tua pagina inglese agli utenti francesi, o la pagina tedesca agli utenti austriaci che cercano contenuti per la Svizzera tedesca. Le pagine regionali quasi identiche possono anche essere accorpate come duplicati, e nei risultati ne compare una sola.
Per le aziende che lavorano su più mercati europei, un'implementazione hreflang corretta non è facoltativa. Decide quale versione delle tue pagine compare nei risultati locali, e da questo dipendono click-through, esperienza utente e conversioni. È anche facile sbagliarla. Nel 2023 Ahrefs ha controllato 374.756 domini che usano hreflang. Il 67% aveva almeno un problema hreflang, e la sola mancanza di x-default compariva sul 56,3% di loro.
Se di questa guida tieni a mente un solo processo, che sia questo. Segui gli undici passaggi in ordine ogni volta che aggiungi una nuova lingua o fai l'audit di un set esistente.
L'ordine conta. La maggior parte delle implementazioni rotte che verifichiamo cade al passaggio 6 (un link di ritorno mancante) o al passaggio 8 (un canonical che scavalca in silenzio l'annotazione hreflang), ed entrambi i problemi restano invisibili finché il traffico verso un mercato secondario non inizia a calare.
Ci sono tre modi per implementare hreflang: elementi link nell'head della pagina, header HTTP e sitemap XML. Google li considera equivalenti, quindi scegli quello che il tuo stack riesce a tenere accurato.
Gli elementi link HTML sono il metodo più diffuso. Aggiungi un set di tag link nell'head di ogni pagina, uno per ogni variante di lingua o regione, incluso un tag autoreferenziale. È semplice per i siti piccoli, ma diventa scomodo quando hai decine di varianti linguistiche.
Gli header HTTP si usano per le risorse non HTML (i PDF, per esempio) e tornano utili quando non puoi modificare l'head HTML. Portano le stesse informazioni del metodo HTML, negli header della risposta del server.
Le sitemap XML sono l'approccio migliore per i siti grandi con molte varianti linguistiche. Specifichi le annotazioni hreflang nella sitemap con l'elemento xhtml:link dentro ogni voce URL. La logica hreflang resta in un solo posto, l'audit è più semplice e le pagine HTML non diventano più pesanti. Per i siti con 5 o più varianti linguistiche consigliamo vivamente la sitemap.
Ecco come si confrontano i tre metodi:
| Metodo | Dove si trova | Ideale per | Attenzione a |
|---|---|---|---|
| Elementi link HTML | Nell'head di ogni pagina | Siti piccoli con meno di cinque varianti locali | Ogni pagina ha bisogno del set completo di tag, quindi diventa scomodo quando le varianti sono molte |
| Header HTTP | Negli header della risposta del server | File non HTML come i PDF, o pagine in cui non puoi modificare l'head | Si configura sul server e non sulla pagina, quindi l'audit è più difficile |
| Sitemap XML | Nell'elemento xhtml:link dentro ogni voce URL della sitemap | Siti grandi con cinque o più varianti linguistiche | Serve un generatore di sitemap che sappia quali pagine sono traduzioni l'una dell'altra |
Ogni esempio qui sotto è completo. Sostituisci URL e codici con i tuoi e mantieni la struttura.
Un negozio con pagine separate per Regno Unito, Stati Uniti, Germania e Austria, una sola pagina francese per tutti i francofoni e un selettore di paese nella root:
<!-- Le stesse sei righe vanno su tutti e sei gli URL, selettore incluso -->
<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />
<link rel="alternate" hreflang="en-US" href="https://example.com/us/" />
<link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />
<link rel="alternate" hreflang="de-AT" href="https://example.com/at/" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
La pagina francese usa il codice semplice fr perché serve tutti i francofoni. Le quattro pagine regionali usano lingua più regione perché prezzi e spedizioni cambiano da paese a paese. Il selettore nella root è l'x-default.
Lo stesso prodotto in tre lingue dell'esempio concreto più sotto, dichiarato nella sitemap invece che nell'head. Nota il namespace xmlns:xhtml sull'elemento radice:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/products/widget/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/products/widget/" />
<xhtml:link rel="alternate" hreflang="it" href="https://example.com/it/products/widget/" />
<xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/products/widget/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/products/widget/" />
</url>
<url>
<loc>https://example.com/it/products/widget/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/products/widget/" />
<xhtml:link rel="alternate" hreflang="it" href="https://example.com/it/products/widget/" />
<xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/products/widget/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/products/widget/" />
</url>
<url>
<loc>https://example.com/es/products/widget/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/products/widget/" />
<xhtml:link rel="alternate" hreflang="it" href="https://example.com/it/products/widget/" />
<xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/products/widget/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/products/widget/" />
</url>
</urlset>
Ogni voce <url> elenca tutte le varianti, se stessa inclusa. Invia il file in Search Console, nella sezione Sitemap. Se passi dai tag nell'head alla sitemap, togli i tag dall'head nello stesso rilascio, così le due fonti non possono divergere.
Un PDF non ha un head, quindi le sue versioni alternative viaggiano nella risposta. Il server invia lo stesso header Link per tutti e tre i file (mostrato su una riga, come viene inviato):
HTTP/1.1 200 OK
Content-Type: application/pdf
Link: <https://example.com/docs/guide.pdf>; rel="alternate"; hreflang="en", <https://example.com/it/docs/guida.pdf>; rel="alternate"; hreflang="it", <https://example.com/es/docs/guia.pdf>; rel="alternate"; hreflang="es"
Controlla cosa invia davvero il server con:
curl -sI https://example.com/it/docs/guida.pdf | grep -i '^link:'
La teoria si capisce meglio con un caso concreto. Supponi di gestire un e-commerce con pagine prodotto in inglese (internazionale), italiano e spagnolo. La struttura degli URL è questa:
https://example.com/products/widget/ (en, x-default)https://example.com/it/products/widget/ (it)https://example.com/es/products/widget/ (es)Ognuno di questi tre URL deve avere un set completo e reciproco di annotazioni hreflang. Ecco cosa deve contenere l'head della pagina inglese:
<link rel="alternate" hreflang="en"
href="https://example.com/products/widget/" />
<link rel="alternate" hreflang="it"
href="https://example.com/it/products/widget/" />
<link rel="alternate" hreflang="es"
href="https://example.com/es/products/widget/" />
<link rel="alternate" hreflang="x-default"
href="https://example.com/products/widget/" />
La pagina italiana (/it/products/widget/) deve contenere gli stessi quattro tag, con gli stessi quattro URL, invariati. Lo stesso vale per la pagina spagnola. Tutte e tre le pagine portano il set completo; l'unica cosa che cambia tra loro è il canonical, che ogni pagina fa puntare a se stessa. Se la pagina italiana perde il tag verso quella spagnola, Google ignora l'hreflang tra quelle due pagine. Le altre coppie continuano a funzionare, e nessun report di Search Console segnala la coppia rotta.
Alcune cose da notare in questo esempio. L'x-default e la pagina inglese condividono lo stesso URL, uno schema comune per i siti senza una pagina dedicata alla scelta della lingua. Se hai una pagina selettore in /products/, fai puntare lì l'x-default. Nota anche che i codici lingua sono valori ISO 639-1 semplici (en, it, es) e non codici con la regione. Aggiungi un qualificatore di regione (en-GB, es-MX) solo quando servi contenuti diversi a utenti di paesi diversi che parlano la stessa lingua; altrimenti il codice semplice copre tutti i parlanti di quella lingua.
I due tag fanno lavori diversi. Il canonical sceglie un URL da indicizzare in un gruppo di duplicati. Hreflang collega pagine equivalenti in lingue o regioni diverse. Funzionano insieme solo quando ogni pagina locale è canonical di se stessa.
Sbagliato. La pagina italiana indica la pagina inglese come canonical, quindi Google la tratta come un duplicato della pagina inglese e l'hreflang su di essa non ha effetto:
<!-- Su https://example.com/it/products/widget/ -->
<link rel="canonical" href="https://example.com/products/widget/" />
<link rel="alternate" hreflang="en" href="https://example.com/products/widget/" />
<link rel="alternate" hreflang="it" href="https://example.com/it/products/widget/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/products/widget/" />
Giusto. La pagina italiana è canonical di se stessa ed elenca tutte le varianti:
<!-- Su https://example.com/it/products/widget/ -->
<link rel="canonical" href="https://example.com/it/products/widget/" />
<link rel="alternate" hreflang="en" href="https://example.com/products/widget/" />
<link rel="alternate" hreflang="it" href="https://example.com/it/products/widget/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/products/widget/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/products/widget/" />
Per verificare il risultato, esamina l'URL italiano con Controllo URL in Search Console. L'URL canonico selezionato da Google deve essere l'URL italiano stesso. Le pagine regionali nella stessa lingua che sono quasi copie, come en-GB ed en-US con lo stesso testo, possono comunque finire sotto un solo canonical, quindi dai loro differenze locali reali: prezzo, valuta, spedizioni e contatti.
Strumenti di audit come Ahrefs Site Audit, Semrush e Screaming Frog descrivono i problemi hreflang con parole leggermente diverse. La prima colonna riporta il nome inglese che vedrai più spesso nei report. Dove lo studio Ahrefs del 2023 su 374.756 domini ha misurato un problema, la quota di domini colpiti è nella seconda colonna.
| Nome dell'errore negli strumenti di audit | Cosa significa | Come correggerlo |
|---|---|---|
| Missing return links (no return tags) | La pagina A punta alla pagina B, ma B non punta ad A. Ahrefs l'ha trovato sul 15,3% dei domini. | Genera il set di tag di ogni pagina da un'unica mappa delle versioni locali, così entrambe le pagine stampano lo stesso elenco. |
| Missing self-referencing hreflang | La pagina elenca le pagine sorelle ma non se stessa. Google chiede che ogni versione linguistica elenchi se stessa. Ahrefs ha trovato la mancanza sul 18% dei domini. | Aggiungi l'URL della pagina con il suo codice. Costa una riga e toglie l'avviso. |
| x-default hreflang annotation missing | Manca un ripiego per gli utenti la cui lingua non corrisponde a nessuna variante. È il problema più comune nei dati Ahrefs, sul 56,3% dei domini. | Aggiungi x-default verso un selettore di lingua o la versione di ripiego, con lo stesso valore su ogni pagina. |
| Hreflang to non-canonical | Un URL del set ha un canonical che punta altrove, spesso a una variante con parametri o con una barra finale diversa. Trovato sull'8% dei domini. | Elenca solo URL canonical. Correggi il canonical o l'hreflang in modo che indichino lo stesso URL. |
| Hreflang to redirect or broken page (non-200 hreflang URLs) | Un tag punta a un URL 3xx, 4xx o 5xx, quindi Google non può leggere lì un link di ritorno. Trovato sul 16,9% dei domini. | Punta ogni tag all'URL finale che risponde 200 e aggiorna hreflang nello stesso rilascio di ogni redirect. |
| Invalid language or region code | Valori come "eng" (tre lettere), "ua" per l'ucraino, "la" per l'America Latina o un codice paese senza lingua. Trovato sul 4,6% dei domini. | Usa un codice lingua ISO 639-1, poi un'eventuale regione ISO 3166-1 Alpha 2: en-GB, pt-BR, de-AT. Google tollera en-UK, ma il valore ISO è en-GB. |
| Hreflang and HTML lang mismatch | La pagina dichiara lang="it" nel tag html ma l'hreflang la indica come en. Trovato sul 3,2% dei domini. Google ignora html lang per riconoscere la lingua, ma la differenza di solito vuol dire che un template stampa la versione locale sbagliata. | Imposta i due valori dalla stessa variabile di lingua nel template. |
| Hreflang conflicts within page source code | La pagina indica due URL diversi per lo stesso codice, oppure due metodi danno valori diversi. | Tieni una sola voce per codice su ogni pagina. Se usi due metodi, rendi identici i valori, oppure eliminane uno. |
| Relative hreflang URLs | L'href è /it/ invece di un URL completo. Google chiede URL completi. | Scrivi https://example.com/it/ per intero. |
| Hreflang tags outside the head | Gli elementi link stanno nel body, oppure un elemento non valido più in alto nell'head chiude l'head prima che Google li raggiunga. | Stampa i tag in alto nell'head, prima di script o widget che inseriscono elementi del body. |
| Hreflang to a page missing in that locale | Il tag punta a una versione locale inesistente, che di solito restituisce un 404 o fa redirect alla homepage. | Elenca solo le varianti che esistono. Google permette di omettere alcune lingue su alcune pagine. |
Le annotazioni hreflang devono essere bidirezionali: se la pagina A dichiara la pagina B come variante francese, la pagina B deve dichiarare la pagina A come variante inglese. Se manca una delle due direzioni, Google ignora entrambe le annotazioni. Ahrefs ha trovato link di ritorno mancanti sul 15,3% dei domini controllati.
Sembra semplice, ma su larga scala diventa complesso. Con 10 varianti linguistiche, ogni pagina ha bisogno di 10 tag hreflang (incluso quello autoreferenziale), e tutte e 10 le pagine devono avere annotazioni coerenti. Sono 100 annotazioni da tenere perfettamente sincronizzate su 10 pagine separate. Un'annotazione mancante rompe il collegamento tra quella coppia di pagine, e un bug nel template lo rompe su tutte le pagine in una volta.
La soluzione è generare le annotazioni hreflang in modo programmatico da un'unica fonte di verità, di solito un database o un CMS che sa quali pagine sono traduzioni l'una dell'altra. Non gestire mai a mano i tag hreflang sulle pagine localizzate.
Errore 2: codici lingua e regione sbagliati. Hreflang usa i codici lingua ISO 639-1 e, se servono, i codici regione ISO 3166-1 Alpha 2. Gli errori comuni sono "ua" per l'ucraino (ua è il codice del paese; il codice della lingua è "uk"), "la" per l'America Latina (LA è il codice paese del Laos) e i codici lingua di tre lettere, che Google non supporta. L'inglese britannico è "en-GB", perché GB è il codice regione ISO. Google accetta anche "en-UK", dato che UK è un codice riservato, ma en-GB è la scelta sicura. I codici di scrittura sono validi: "zh-Hans" e "zh-Hant" indicano il cinese semplificato e tradizionale, mentre "zh-CN" indica il cinese per gli utenti in Cina. Scegli quello che corrisponde al modo in cui dividi i contenuti.
Nei progetti europei fai attenzione alle varianti regionali: "pt" (portoghese) è diverso da "pt-BR" (portoghese brasiliano). "en-GB" ed "en-US" sono varianti distinte. Se servi contenuti diversi agli utenti austriaci ("de-AT") e tedeschi ("de-DE"), ti servono annotazioni hreflang separate per ciascuno.
Errore 3: tag x-default mancante. Il valore hreflang x-default dice ai motori di ricerca quale pagina mostrare quando nessun'altra variante corrisponde alla lingua o alla regione dell'utente. Senza x-default, Google sceglie da solo, e la scelta può non essere quella che vuoi. Includi sempre un x-default che punti alla pagina di selezione della lingua o alla versione inglese come ripiego.
Errore 4: conflitti tra canonical e hreflang. Se una pagina ha un tag canonical che punta a un URL diverso da quello indicato dall'annotazione hreflang, Google segue il canonical e ignora l'hreflang. Ogni pagina citata nelle annotazioni hreflang deve avere un canonical autoreferenziale. Se la pagina francese in /fr/product/ ha un canonical che punta a /en/product/, l'annotazione hreflang della pagina francese viene ignorata in silenzio.
Errore 5: hreflang che punta a pagine non 200. Ogni URL nelle annotazioni hreflang deve rispondere con lo stato HTTP 200. Se un URL risponde con un redirect 301, un 404 o un errore 500, Google non può leggere lì un link di ritorno, quindi le annotazioni che puntano a quell'URL vengono ignorate. Succede spesso durante le migrazioni o i cambi di struttura degli URL, quando i vecchi URL vengono reindirizzati ma le annotazioni hreflang non vengono aggiornate nello stesso momento.
Per intercettare questi problemi, imposta un monitoraggio automatico. Search Console non ha un report degli errori hreflang da quando Google ha rimosso il report International Targeting a settembre 2022. Crawler come Screaming Frog, Sitebulb o Ahrefs Site Audit controllano ogni annotazione a ogni crawl, quindi lanciane uno dopo ogni rilascio che tocca URL o template.
Mettere i tag nella pagina è solo metà del lavoro. Devi confermare che Google li legga e che niente si rompa dopo. Google ha rimosso il report International Targeting di Search Console il 22 settembre 2022, e nessun report hreflang lo ha sostituito. Oggi la validazione combina un crawler, un controllo del sorgente e i report di Search Console che esistono ancora.
Un crawler dedicato per hreflang. Strumenti come Screaming Frog (Configuration > Spider > Crawl linked XML sitemaps and hreflang), Sitebulb e JetOctopus seguono le relazioni hreflang sull'intero set di versioni locali in una sola passata. Mostrano link reciproci rotti, URL che non coincidono tra pagine collegate e tag che puntano a redirect o 404, tutto in un unico export. Per qualsiasi sito con più di due o tre varianti locali, un crawl è l'unico modo realistico per trovare gli errori sistematici.
Un controllo curl rapido su un URL. Quando vuoi verificare una singola pagina subito dopo il deploy, puoi leggere l'head HTML grezzo senza un crawl completo:
curl -s "https://example.com/products/widget/" | grep -i hreflang
Il comando stampa ogni elemento link hreflang nel sorgente della pagina. Controlla che il numero corrisponda alle varianti locali che ti aspetti (x-default incluso) e che ogni URL sia assoluto e non relativo. Google chiede URL completi, e gli strumenti di audit segnalano quelli relativi.
Search Console, passo per passo. Questi report non elencano errori hreflang, ma mostrano se Google ha indicizzato ogni pagina locale e l'ha mostrata nel mercato giusto:
Come si implementano correttamente i tag hreflang?
Dichiara hreflang in un solo posto per pagina (elementi link nell'head, header HTTP o voci nella sitemap XML) e usa sempre lo stesso metodo. Ogni variante fa riferimento a tutte le varianti, se stessa inclusa, e ogni riferimento deve essere reciproco. Ahrefs ha trovato tag autoreferenziali mancanti sul 18% dei domini e link di ritorno mancanti sul 15,3%.
Dove vanno i tag hreflang: head HTML, header HTTP o sitemap?
L'head HTML è adatto ai siti con meno di cinque varianti locali. Gli header HTTP servono per i file non HTML come i PDF, o quando non puoi modificare l'head. Il metodo sitemap è il più adatto ai siti grandi, quando hai centinaia di pagine per lingua e vuoi tenere leggere le pagine. Google considera equivalenti i tre metodi, e usarne più di uno non porta vantaggi. Se ne usi due, i valori devono coincidere, perché valori in conflitto sono un errore frequente negli audit.
Cosa significa x-default?
x-default è il valore hreflang di ripiego. Dice ai motori di ricerca quale pagina servire quando nessuna lingua o regione corrisponde all'utente, e di solito punta a un selettore di lingua o alla versione inglese principale. Se lo ometti, Google tira a indovinare, e spesso nelle regioni non mappate compare la versione sbagliata.
Perché il mio hreflang non funziona?
Le cause abituali sono cinque: un link non reciproco, un codice ISO sbagliato (ua invece di uk per l'ucraino), un canonical che punta a un'altra versione locale, valori in conflitto tra due metodi di dichiarazione, oppure hreflang che punta a un URL che risponde 404 o fa redirect. Search Console non ha più un report hreflang dal 2022, quindi usa un crawler come Screaming Frog e verifica l'URL canonico selezionato da Google in Controllo URL prima di concludere che Google ignora i tag.
Che differenza c'è tra hreflang e canonical?
Il canonical dice a Google quale URL indicizzare in un gruppo di duplicati. Hreflang dice a Google quale pagina equivalente mostrare per ogni lingua o regione. Usali entrambi: ogni pagina locale è canonical di se stessa ed elenca ogni pagina sorella in hreflang. Un canonical che punta a un'altra versione locale annulla l'hreflang di quella pagina.
E se una pagina esiste solo in alcune lingue?
Elenca solo le varianti che esistono. Google accetta un set diverso su ogni pagina, quindi una pagina solo in inglese e italiano porta en, it e x-default, mentre una pagina in tutte e tre le lingue porta tutti e quattro i valori. Non coprire il buco puntando la lingua mancante alla homepage o a un 404.
Come mantengo corretto hreflang quando il CMS genera gli URL localizzati in modo dinamico?
Genera i tag dalla stessa mappa delle versioni locali che costruisce gli URL, al momento del rendering o nel job della sitemap. Quando lanci una nuova lingua, la mappa riceve una voce in più e ogni pagina del cluster stampa il nuovo tag al rendering o alla generazione della sitemap successivi. Fai un crawl del sito dopo ogni lancio per trovare le pagine che la mappa ha saltato.
Abbiamo otto mercati e nessuna strategia hreflang. Da dove partiamo?
Decidi, mercato per mercato, se ti serve un URL per lingua o uno per paese. Dividi per paese solo dove cambiano prezzi, spedizioni, condizioni legali o l'offerta. Poi costruisci la mappa delle versioni locali, scegli un metodo (la sitemap scala meglio per i cataloghi grandi), pubblicalo su un solo template, fai il crawl ed estendilo al resto. La checklist in undici passaggi qui sopra copre i dettagli.
Hreflang aiuta con i contenuti duplicati tra siti di paesi diversi?
Sì, ma in un modo preciso. Hreflang non sopprime i segnali di contenuto duplicato come fa un canonical. Dice a Google che due pagine simili sono pensate per pubblici diversi, quindi vanno trattate come risultati separati e mirati invece che come copie in concorrenza. Se il contenuto è quasi identico tra le versioni locali e cambiano solo la valuta o il formato delle date, le annotazioni servono comunque, ma chiediti con onestà se quelle pagine rispondono a bisogni diversi. Una differenziazione minima con hreflang è meglio di niente, e una localizzazione vera manda segnali più forti.
Quanti tag hreflang può avere una pagina?
Google non documenta un limite. Ogni variante aggiunge un elemento link a ogni pagina del cluster, quindi l'head cresce a ogni lingua che lanci. Da cinque varianti locali in su, passa al metodo sitemap, che non aggiunge peso alla pagina.
Serve hreflang se le pagine sono nella stessa lingua ma per paesi diversi?
Sì. Se servi contenuti diversi, per esempio, a utenti britannici e australiani di lingua inglese (prezzi, disponibilità dei prodotti o condizioni legali diversi), hreflang con i codici regione (en-GB e en-AU) dice a Google di mostrare ogni variante al pubblico giusto. Senza hreflang, Google sceglie la versione che considera più autorevole e può mostrarla ovunque. Le pagine che cambiano solo per l'ortografia di "colour" probabilmente non valgono il lavoro in più; quelle con prezzi, spedizioni o note legali diverse sì.
Parte della nostra guida completa: International SEO →
Questo articolo fa parte del nostro knowledge hub su international seo. Leggi la guida completa per un framework strategico completo.
Il nostro team aiuta le aziende a implementare i framework e le strategie trattate in questo articolo.
Contattaci