Se pubblichi gli stessi contenuti in due o più lingue, hai un problema su cui Google ha bisogno di aiuto: quale versione mostrare a quale utente. Senza segnali espliciti, Google potrebbe decidere che la pagina inglese rankerà meglio di quella italiana in Italia, oppure che le due pagine sono quasi-duplicate e solo una merita di essere indicizzata. Hreflang è il piccolo set di tag HTML che risolve la cosa.

La documentazione ufficiale è lunga e piena di casi limite. La versione operativa delle regole è corta.

Cosa fa davvero hreflang

Per ogni pagina che ha una traduzione, elenchi tutte le versioni linguistiche (compresa quella stessa), ognuna con un codice lingua. Google legge i tag, costruisce un "cluster" di pagine equivalenti, e serve quella che corrisponde alla lingua del browser e alla posizione dell'utente.

Una pagina con i tag hreflang non rankerà più alta grazie a loro. Verrà semplicemente servita alla persona giusta. Il beneficio SEO è indiretto: meno bounce dagli utenti che atterrano nella lingua sbagliata, nessuna penalità per duplicate content fra le traduzioni, crawling più rapido perché Google capisce la struttura.

Le tre regole che non puoi rompere

Regola 1. Auto-riferimento. Ogni pagina deve elencare se stessa nel proprio blocco hreflang. La pagina inglese elenca inglese più italiano. La pagina italiana elenca italiano più inglese. Se la pagina non include se stessa, l'intero blocco viene ignorato da Google.

Regola 2. Reciprocità. Se la pagina A dice "la mia versione italiana è all'URL B", la pagina B deve dire "la mia versione inglese è all'URL A". I blocchi asimmetrici vengono scartati silenziosamente. Questo è il bug più frequente nei siti reali: qualcuno aggiunge una traduzione, la collega dall'originale, ma si dimentica di mettere il link al contrario.

Regola 3. URL assoluti. I valori di hreflang devono essere URL completi (https://example.com/it/pagina), mai path relativi (/it/pagina). Google rifiuta i relativi.

Se il tuo sito rispetta queste tre regole, hreflang funziona. La maggior parte delle complicazioni viene da chi non le rispetta.

I codici che ti servono

Il valore di hreflang è uno fra:

  • Un codice lingua: en, it, fr, de, es. Due lettere, ISO 639-1.
  • Una lingua più una regione: en-US, en-GB, pt-BR, pt-PT, es-ES, es-MX. La regione usa ISO 3166-1 alpha-2.
  • Il valore speciale x-default, che significa "usa questa pagina se nessun'altra versione corrisponde".

Quando usare il codice lingua semplice (it) e quando la forma con regione (it-IT):

  • Usa il codice lingua semplice se i contenuti sono uguali per tutte le regioni che parlano quella lingua. Una versione italiana per tutti gli italofoni, una inglese per tutti gli anglofoni. Quasi tutti i siti devono fare così.
  • Usa la forma regionale solo se hai contenuti effettivamente diversi per regione: prezzi in valute diverse, policy di spedizione diverse, testi legali diversi. en-US e en-GB devono differire per qualcosa di concreto, non solo per "colour" vs "color".

x-default è per la pagina che Google deve servire agli utenti la cui lingua non corrisponde a nessuna delle tue traduzioni. Di solito punta alla versione inglese, che è anche la tua pagina en. È corretto così: un singolo URL può essere sia en sia x-default.

Dove mettere i tag

Tre posti, in ordine di preferenza.

HTML head: il più semplice, consigliato per quasi tutti i siti. Ogni pagina include:

<link rel="alternate" hreflang="en" href="https://example.com/en/page">
<link rel="alternate" hreflang="it" href="https://example.com/it/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page">

Queste tre righe vanno sia sulla pagina inglese sia su quella italiana. Blocco identico, su ogni traduzione.

Header HTTP: utili per risorse non-HTML come i PDF, dove non puoi mettere un tag <link>. Stessa informazione, sintassi diversa:

Link: <https://example.com/en/page>; rel="alternate"; hreflang="en",
      <https://example.com/it/page>; rel="alternate"; hreflang="it"

Sitemap XML: utile quando hai centinaia di pagine tradotte e vuoi tenere il markup fuori dall'HTML. Ogni elemento <url> contiene i link alle versioni alternate. Stessa logica della versione HTML, in formato sitemap.

Scegli un metodo e attieniti a quello. Mescolarne due dà a Google segnali contraddittori.

Cosa va storto

La lista degli errori tipici, in ordine di frequenza:

  1. Auto-riferimento dimenticato. La pagina italiana elenca solo la versione inglese, non se stessa. Google scarta l'intero cluster.
  2. Una direzione sola. La pagina inglese punta all'italiana, l'italiana si dimentica di puntare all'inglese. Google ignora la coppia asimmetrica.
  3. Canonicalizzazione URL sbagliata. Hreflang punta a https://example.com/en/page/ (con slash finale) ma la pagina vera è a https://example.com/en/page (senza). Google vede un 301 e considera il link rotto.
  4. Canonical mescolato. La pagina inglese ha <link rel="canonical" href="https://example.com/it/page"> (puntando a quella italiana). Significa "la versione vera è quella italiana, ignoratemi". Hreflang e canonical si contraddicono, vince canonical, e la versione inglese sparisce dall'indice.
  5. Codice incoerente. Usare en-uk invece di en-GB. UK non è il codice paese, GB sì. Google rifiuta i codici sconosciuti.
  6. Codici inesistenti. Usare gb, uk, eu come codici lingua. I codici lingua sono ISO 639-1 (due lettere), i codici regione sono ISO 3166-1 (due lettere). Sono liste diverse.

Come verificare: Google Search Console ha un report "International Targeting" (sotto i Legacy tools). Ti dice quali cluster sono corretti e quali hanno errori. Per controlli puntuali, le estensioni del browser come "Hreflang tags checker" ispezionano i tag della pagina corrente.

Un esempio minimale che funziona

Un sito con inglese e italiano, dove la traduzione italiana di /about vive a /it/about, l'inglese a /en/about, e l'/about nudo fa redirect a /en/about:

Su https://example.com/en/about:

<link rel="canonical" href="https://example.com/en/about">
<link rel="alternate" hreflang="en" href="https://example.com/en/about">
<link rel="alternate" hreflang="it" href="https://example.com/it/about">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/about">

Su https://example.com/it/about:

<link rel="canonical" href="https://example.com/it/about">
<link rel="alternate" hreflang="en" href="https://example.com/en/about">
<link rel="alternate" hreflang="it" href="https://example.com/it/about">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/about">

Il canonical è auto-referenziale su ogni pagina. Il blocco hreflang è identico su entrambe. Lo x-default è uguale su entrambe e punta alla versione inglese.

Questo è tutto il setup. Lo copi per ogni pagina tradotta, cambi lo slug, e hai finito. Le varianti del mondo reale (più lingue, sotto-versioni regionali, generazione automatica in PHP, basata su sitemap) sono estensioni meccaniche dello stesso schema.

Cosa hreflang non fa

Equivoci comuni da chiarire:

  • Non fa redirect automatici. Hreflang dice a Google cosa servire nei risultati di ricerca. Non influisce su cosa fa il tuo server quando un utente digita direttamente l'URL.
  • Non influisce sul ranking, solo sul targeting. Una pagina mediocre in italiano rankerà comunque male in Italia. Hreflang serve solo a far sì che venga servita all'utente italiano invece di quella inglese.
  • Non risolve il problema "quale lingua mostro di default". È una decisione separata (header Accept-Language, geolocalizzazione IP, switcher manuale), con i suoi compromessi.

La buona notizia: una volta che hreflang è a posto, te ne dimentichi. La cattiva notizia: farlo bene richiede che ogni traduzione, su ogni pagina, punti a ogni altra versione, in ogni direzione. Il vero lavoro è la contabilità.