eduardweb.
SEO & PerformanceIntermediar#seo#nextjs#webdev#hreflang#xml-sitemap

Hreflang pe site-uri multi-country (.ro + .com): Implementare fără erori și verificare

De Radu Grigore, 23 iul. 2026 · 10 vizualizări · 2 like-uri

Postat 23 iul. 2026
xml
<?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://site.ro/produs-demo</loc>
    <xhtml:link rel="alternate" hreflang="ro" href="https://site.ro/produs-demo" />
    <xhtml:link rel="alternate" hreflang="en" href="https://site.com/demo-product" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://site.com/demo-product" />
  </url>
  <url>
    <loc>https://site.com/demo-product</loc>
    <xhtml:link rel="alternate" hreflang="ro" href="https://site.ro/produs-demo" />
    <xhtml:link rel="alternate" hreflang="en" href="https://site.com/demo-product" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://site.com/demo-product" />
  </url>
</urlset>

M-am lovit recent de o problemă clasică la un e-commerce bilingv cu peste 40k de produse: Google indexa variantele de .com pentru căutările din România și invers. Dacă ai un setup cu .ro (limba română) și .com (engleză/global), o configurare greșită de hreflang îți poate îngropa conversiile fără să-ți dai seama. Hai să vezi cum am rezolvat-o curat și cum verifici că nu ai rupt etichetele canonice pe parcurs.

Regulile de aur pe care mulți le uită

Pe hârtie e simplu: pui rel="alternate" hreflang="x". În practică, la ultimul audit SEO făcut pe o aplicație Next.js, am găsit trei greșeli majore care anulau tot semnalul pentru botul Google.

Prima chestie: reciproca este obligatorie. Dacă pagina A din .ro trimite către pagina B din .com, pagina B trebuie să aibă un tag identic înapoi către A. Dacă lipsește legătura inversă, Google ignoră complet ambele etichete pentru că le consideră nesigure.

A doua chestie: autospecificarea (self-referential hreflang). Pagina din .ro trebuie să aibă un tag hreflang către ea însăși, nu doar către varianta străină.

A treia bușeală frecventă e codul de regiune. Mulți scriu en-UK în loc de en-GB sau inventează combinații. Formatul ISO este clar: limba (ISO 639-1) urmată opțional de țară (ISO 3166-1 alpha-2). Pentru .ro folosești ro (sau ro-RO dacă țintești strict România), iar pentru .com pui en sau x-default pentru utilizatorii internaționali din afara regiunilor vizate.

Unde pui etichetele: HTML vs XML Sitemap

Ai două opțiuni principale: în <head>-ul fiecărei pagini HTML sau direct în sitemap-ul XML.

Dacă ai un site mic, cu 20-30 de pagini, să le injectezi în HTML e ok. Dar la proiectul de 40k de pagini, unde aveam 5 variante regionale pe produs, HTML-ul crescuse cu aproape 12KB per pagină doar din tag-uri de header. Asta înseamnă un parsing time mai mare și resurse irosite la rendering.

Am mutat toată logica în XML sitemap. E mult mai curat, decuplează SEO-ul regional de codul de frontend și nu umflă DOM-ul. Trade-off-ul? Sitemap-urile devin uriașe și procesul de re-indexare durează puțin mai mult până le parcurge Google pe toate, dar salvezi memorie și latență la fiecare request de utilizator.

Atenție la conflictul cu canonical-ul!

Aceasta e greșeala fatală. Fiecare pagină dintr-o rețea hreflang trebuie să aibă propriul ei canonical către ea însăși (self-canonical).

Dacă pui canonical de pe pagina de .ro către varianta .com pentru că ai conținut similar, ai distrus tot setup-ul. Google va vedea un semnal contradictoriu: hreflang-ul spune „arată varianta asta în RO”, dar canonical-ul spune „ignore-o pe asta, folosește .com”. În 90% din cazuri, Google va alege să indexeze doar una și va ignora tag-urile de limbă.

Cum verifici corectitudinea

Nu te baza pe inspecția vizuală în browser, te fură ochii. Eu folosesc un crawl cu Screaming Frog unde bifez opțiunea de Enable Hreflang Processing. Îmi generează instant un raport cu „Unlinked hreflang destinations” și „Missing self-reference”.

În Google Search Console nu mai există vechiul raport de International Targeting, dar poți folosi URL Inspection tool. Verifică la secțiunea Page indexing dacă Google a detectat paginile alternative alternate în momentul crawl-ului.

Pentru un setup simplu .ro + .com, regula e clară: hreflang="ro" pe .ro, hreflang="en" pe .com și hreflang="x-default" configurat tot pe .com ca fallback global.

Voi cum gestionați atributele astea la proiecte mari: le generați dinamic în render-ul de server sau preferați sitemap-ul XML separat?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.