Zduplikowana treść to cichy zabójca witryn wielojęzycznych i stron z parametrami. Naprawiają to dwa mechanizmy.
Canonical mówi wyszukiwarkom, który URL jest „prawdziwy", 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 informuje, jakie wersje językowe strony istnieją, żeby polski użytkownik dostał w wynikach polską stronę:
export async function generateMetadata({ params }): Promise<Metadata> {
const { lang, slug } = params;
return {
alternates: {
canonical: `/${lang}/blog/${slug}`,
languages: {
en: `/en/blog/${slug}`,
pl: `/pl/blog/${slug}`,
ru: `/ru/blog/${slug}`,
"x-default": `/en/blog/${slug}`,
},
},
};
}
Błędy, które kosztują realny ruch:
- hreflang musi być wzajemny. Jeśli strona EN wskazuje wersję PL, strona PL musi wskazywać z powrotem EN — inaczej Google ignoruje 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