Dubbele content kan op meertalige sites en pagina's met parameters onduidelijkheid bij het indexeren veroorzaken. Twee mechanismen helpen om dat te beheersen.
Canonical wijst naar de voorkeurs-URL
Het vertelt zoekmachines welke URL de voorkeur heeft wanneer meerdere adressen dezelfde content serveren (trackingparameters, schuine strepen, paginatie):
export async function generateMetadata({ params }): Promise<Metadata> {
return {
alternates: {
canonical: `/blog/${params.slug}`,
},
};
}
hreflang koppelt de taalversies
Het vertelt zoekmachines welke taalversies bestaan en helpt bij het kiezen van de juiste. Hoe je de adressen ophaalt, hangt af van je contentmodel; het voorbeeld gaat ervan uit dat getLocalizedUrls() de echte URL van elke versie teruggeeft:
export async function generateMetadata({ params }): Promise<Metadata> {
const { lang } = params;
const localizedUrls = await getLocalizedUrls(params);
return {
alternates: {
canonical: localizedUrls[lang],
languages: {
...localizedUrls,
"x-default": localizedUrls.en,
},
},
};
}
Veelgemaakte implementatiefouten
- hreflang moet wederkerig zijn. Verwijst de EN-pagina naar de PL-versie, dan moet de PL-pagina terugverwijzen naar EN, anders kan Google de hele groep negeren.
- Elke pagina moet zichzelf bevatten in de
languages-map. - Gelokaliseerde slugs: staat een Pools bericht onder een andere slug, dan moet hreflang naar de echte gelokaliseerde URL wijzen en niet mechanisch naar
/pl/+ dezelfde slug. Genereer de map uit de contentbron, hardcode haar niet. x-defaultvangt gebruikers op wier taal je niet ondersteunt: richt hem op de hoofdlocale.- Canonical moet naar een pagina leiden die 200 teruggeeft en geen
noindexheeft; een canonical naar een doorverwijzende URL wordt genegeerd.
Checklist:
- Zelfverwijzende canonical op elke indexeerbare pagina
- hreflang gegenereerd uit echte gelokaliseerde slugs, wederkerig in alle richtingen
-
x-defaultaanwezig - URL-parameters (utm, filters, sortering) gecanoniseerd naar het schone adres
