Hreflang i canonical w Next.js — SEO wielojęzycznych stron bez duplikacji
Jak poprawnie ustawić hreflang i canonical w Next.js App Router? Unikanie duplikacji treści, konfiguracja metadata API, wielojęzyczna sitemap i typowe błędy SEO.
Hreflang to atrybut wskazujący wyszukiwarce językowe i regionalne warianty tej samej strony, np. polski i angielski. Poprawnie ustawiony zapobiega duplikacji i kieruje użytkownika do właściwej wersji językowej. to atrybut HTML, który informuje Google, która wersja językowa strony jest przeznaczona dla danego regionu lub języka. Bez hreflang Google może wyświetlić polską wersję użytkownikowi anglojęzycznemu lub potraktować wersje językowe jako duplikaty (kanibalizacja). Może też indeksować tylko jedną wersję. Krótko mówiąc: bez hreflang czeka nas bałagan, podczas gdy hreflang wprowadza kontrolę i porządek.
Canonical wskazuje preferowany URL, który ma być traktowany jako główna wersja podobnej lub zduplikowanej strony. (link rel="canonical") wskazuje „źródłową" wersję strony i w ten sposób eliminuje duplikaty wynikające z parametrów URL, trailing slashy, czy wariantów http/https. Oba tagi "współpracują" ze sobą, ponieważ hreflang łączy wersje językowe, canonical wyznacza kanoniczną wersję w każdym języku.
Hreflang w Next.js App Router — Metadata API
Code
// app/[locale]/page.tsximport type { Metadata } from 'next'const locales = ['pl', 'en', 'de']const baseUrl = 'https://strivelab.pl'// Polska wersja na rootu domeny, pozostałe języki z prefiksemconst getLocaleUrl = (locale: string, path = '') => locale === 'pl' ? `${baseUrl}${path}` : `${baseUrl}/${locale}${path}`export async function generateMetadata({ params,}: { params: Promise<{ locale: string }>}): Promise<Metadata> { const { locale } = await params return { alternates: { canonical: getLocaleUrl(locale), languages: { pl: baseUrl, en: `${baseUrl}/en`, de: `${baseUrl}/de`, 'x-default': baseUrl, }, }, }}
Polska wersja działa na rootu domeny (https://strivelab.pl/) bez prefiksu /pl — domena .pl już precyzuje rynek. Pozostałe języki mają własny prefiks (/en, /de). Kluczową zasadą jest by canonical, hreflang, Sitemap to plik z listą ważnych URL-i, który pomaga wyszukiwarkom szybciej odkrywać i aktualizować podstrony. i linkowanie wewnętrzne były konsekwentnie używane wobec tego samego wariantu URL.
Diagram
Poprawna relacja canonical i hreflang dla wersji językowych
Jeśli slugi są tłumaczone (/pl/blog/jak-zbudowac-strone vs /en/blog/how-to-build-website), każda wersja językowa musi wskazywać na poprawny slug w danym języku.
x-default wskazuje wersję dla użytkowników, których język nie jest obsługiwany. Warto zaznaczyć, że nie jest to obowiązkowe w każdym projekcie, ale zwykle warto go dodać, jeśli masz stronę domyślną albo selektor języka.
2. Brak wzajemności (reciprocal links)
Jeśli strona PL wskazuje na EN, to EN musi wskazywać z powrotem na PL. W wypadku braku wzajemności = Google ignoruje hreflang.
3. Canonical i hreflang wskazują na różne URL-e
Canonical powinien wskazywać na siebie (w danym języku), nie na inną wersję językową. Każda wersja językowa ma własny canonical.
4. Hreflang na stronach z noindex
Jeśli strona ma atrybut noindex, wtedy hreflang jest ignorowany.
Weryfikacja
Google Search Console → inspekcja konkretnych URL-i i raport indeksowania,
Ahrefs / Screaming Frog — audyt hreflang na dużą skalę,
Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.
Jak generować sitemap.xml i robots.txt w Next.js App Router? Natywne API konwencji plików vs next-sitemap — dynamiczne sitemaps, lastmod, changefreq i priorytety.
Jak korzystać z Google Search Console dla strony Next.js? Weryfikacja, sitemap, indeksacja, Core Web Vitals, crawl budget i najczęstsze problemy — praktyczny poradnik.
Jak Next.js wpływa na SEO w praktyce? SSR, SSG, metadata, Core Web Vitals i techniczne ograniczenia, o których warto wiedzieć przed wyborem frameworka.