import { Metadata } from 'next';
interface Props {
params: { slug: string };
}
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const baseUrl = 'https://eduardweb.ro';
// Ne asigurăm că URL-ul canonical este curat, fără query params de tracking
const canonicalUrl = `${baseUrl}/blog/${params.slug}`;
return {
alternates: {
canonical: canonicalUrl,
},
};
}La un magazin online cu vreo 12.000 de produse active, ne-am trezit în Search Console cu peste 80.000 de URL-uri excluse sau, mai rău, indexate aiurea. Googlebot își pierdea timpul prin pagini de filtre, sortări și paginații infinite. Problema? Echipa de dinaintea noastră pusese canonical-uri dinamice care copiau exact URL-ul din browser, inclusiv parametrii de tracking. Practic, am anulat scopul tag-ului.
Dacă ai parametrii de tracking (cum e ?utm_source) sau filtre de sortare (?sort=price_desc), regula e simplă: canonical-ul trebuie să arate mereu spre varianta curată. Altfel, Google va consuma bugetul de crawling pe pagini duplicate și riști să nu îți mai indexeze paginile cu adevărat importante.
Coșmarul paginării: Mitul paginii numărul unu
Am văzut des greșeala asta: pe paginile /produse?page=2, /produse?page=3 se pune canonical către /produse. Nu face asta. Google a scos de mult suportul pentru tag-urile rel="next" și rel="prev". Dacă pui canonical pe prima pagină, crawlerul va ignora produsele de pe paginile 2, 3, etc., crezând că sunt duplicate ale primei pagini.
Soluția corectă? Fiecare pagină de paginare trebuie să aibă un tag canonical self-referencing (adică /produse?page=2 are canonical către /produse?page=2). Trade-off-ul este că Google va trebui să crawleze mai multe pagini, consumând mai multe resurse, dar măcar îți vede produsele din adâncime.
Cross-domain canonical: Când preiei articole
Dacă ai un blog tehnic și republici un articol de pe Medium sau dev.to pe site-ul tău, folosește canonical către sursa originală. Am făcut asta la un proiect unde preluam comunicate de presă de pe un domeniu partener.
Ne-am asigurat că nu suntem penalizați pentru duplicate content, iar autorul original a păstrat toată autoritatea în motoarele de căutare. Singurul dezavantaj e că pagina ta nu va ranka aproape niciodată deasupra originalului în rezultatele Google, dar e un trade-off corect pentru a evita penalizările de domeniu.
Cum implementăm asta dinamic?
Dacă folosești un framework modern ca Next.js (App Router), e destul de simplu să generezi canonical-ul dinamic în funcție de slug-ul paginii, curățând parametrii inutili de query. Evită să hardcodezi URL-urile direct în layout-uri globale fără o logică de curățare.
Voi cum gestionați parametrii de URL în SEO? Îi blocați direct din Robots.txt sau vă bazați doar pe canonical tags?