Zduplikowana treść może powodować niejednoznaczność indeksowania w witrynach wielojęzycznych i na stronach z parametrami. Pomagają nią zarządzać dwa mechanizmy.
Canonical wskazuje preferowany URL
Informuje wyszukiwarki, który URL jest preferowany, gdy tę samą treść serwuje kilka adresów (parametry śledzące, ukośniki, paginacja):
export async function generateMetadata({ params }): Promise<Metadata> {
return {
alternates: {
canonical: `/blog/${params.slug}`,
},
};
}
hreflang łączy wersje językowe
Informuje wyszukiwarki, jakie wersje językowe istnieją, i pomaga dobrać właściwą wersję. Sposób pobierania adresów zależy od modelu treści; przykład zakłada, że getLocalizedUrls() zwraca rzeczywisty URL każdej wersji:
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,
},
},
};
}
Typowe błędy wdrożeniowe
- hreflang musi być wzajemny. Jeśli strona EN wskazuje wersję PL, strona PL musi wskazywać z powrotem EN — inaczej Google może pominąć całą grupę.
- Każda strona musi zawierać samą siebie w mapie
languages. - Zlokalizowane slugi: jeśli polski wpis żyje pod innym slugiem, hreflang musi wskazywać rzeczywisty zlokalizowany URL, a nie mechaniczne
/pl/+ ten sam slug. Generuj mapę ze źródła treści, nie hardkoduj. x-defaultobsługuje użytkowników, których języka nie wspierasz — skieruj go na główną lokalizację.- Canonical musi prowadzić do strony zwracającej 200 i bez
noindex— canonical do przekierowującego URL-a jest ignorowany.
Checklista:
- Samoodnoszący się canonical na każdej indeksowalnej stronie
- hreflang generowany z prawdziwych zlokalizowanych slugów, wzajemny we wszystkich kierunkach
- Obecny
x-default - Parametry URL (utm, filtry, sortowanie) kanonizowane do czystego adresu
