import { Metadata } from 'next';
interface HreflangParams {
roPath: string;
comPath: string;
isRoDomain: boolean;
}
export function generateHreflangMetadata({ roPath, comPath, isRoDomain }: HreflangParams): Metadata {
const roUrl = `https://domeniu.ro${roPath}`;
const comUrl = `https://domeniu.com${comPath}`;
return {
alternates: {
canonical: isRoDomain ? roUrl : comUrl,
languages: {
'ro-RO': roUrl,
'en': comUrl,
'x-default': comUrl,
},
},
};
}Salutare! Dacă ai gestionat vreodată un site extins pe mai multe țări (.ro și .com), știi deja cât de repede se poate transforma totul într-un hățiș de indexare. Am avut cazul acum un an pe un e-commerce cu peste 12k de produse: Google a început să indexeze paginile în engleză de pe .com pe căutări locale în limba română, iar traficul pe .ro a scăzut cu aproape 18% în două săptămâni.
Problema? Tagurile hreflang erau puse la jumătate, fără reciprocitate, iar unele aveau linkuri relative. Hai să vedem cum se face treaba asta corect din punct de vedere tehnic și cum scapi de erori.
Regulile nenegociabile pentru hreflang
Când lucrezi cu domenii separate, cum ar fi domeniu.ro și domeniu.com, Google are nevoie de instrucțiuni explicite. Dacă uiți o singură regulă, crawler-ul pur și simplu le ignoră.
- Reciprocitate strictă: Dacă pagina A (
domeniu.ro/produs) pointează către pagina B (domeniu.com/en/product), atunci pagina B TREBUIE să aibă un taghreflangcare pointează înapoi la pagina A. - URL-uri absolute: Niciodată nu folosi căi relative gen
/produs. Întotdeauna URL complet cu protocol (https://...). - Self-referencing: Pagina pe care ești trebuie să conțină și propriul ei tag
hreflang. - Fallback cu x-default: Esențial pentru utilizatorii care vin din țări neacoperite explicit în configurare.
Marele trade-off la injecția în HTML (în <head>) este dimensiunea DOM-ului. Dacă ai 30 de versiuni de țară, adaugi 30 de linii de cod pe fiecare pagină renderizată. În cazul nostru, fiind doar două domenii (.ro pentru RO și .com pentru EN + restul lumii), injecția directă în HTML e cea mai simplă și curată variantă.
Setup-ul de cod pentru .ro și .com
Iată ce trebuie să meargă în head-ul paginii pentru un produs existent pe ambele domenii:
-
Pe
domeniu.ro/tricou-bumbac:ro-RO->https://domeniu.ro/tricou-bumbacen->https://domeniu.com/cotton-tshirtx-default->https://domeniu.com/cotton-tshirt
-
Pe
domeniu.com/cotton-tshirt:ro-RO->https://domeniu.ro/tricou-bumbacen->https://domeniu.com/cotton-tshirtx-default->https://domeniu.com/cotton-tshirt
Observă cum canonical-ul rămâne întotdeauna local pe domeniul curent, iar hreflang-ul doar semnalează alternativele geografice.
Cum verifici că totul e în regulă
Nu aștepta rapoartele din Google Search Console. Vin cu o întârziere de 3-5 zile și până afli că ai erori, deja ai pierdut poziții în SERP.
Eu folosesc două metode de verificare:
- Screaming Frog: Bifezi opțiunea "Crawl Hreflang" în Configuration > Spider. Îți arată instant erorile de tip "Unreciprocated hreflang" sau "Missing x-default".
- Inspecție rapidă prin curl: Dai un cURL și cauți tagurile
<link rel="alternate". E util mai ales când vrei să testezi rapid din terminal pe un mediu de staging.
Voi cum gestionați hreflang-ul pe proiecte mari? Preferați să le puneți în HTML, în header-ul HTTP sau le împingeți direct prin XML Sitemap?