Listingi kategorii, archiwa bloga i widoki filtrowane generują więcej URL-i niż cała reszta witryny razem wzięta — i większość z nich nie powinna być indeksowana. To tutaj umiera crawl budget i to tu naprawdę rodzą się problemy duplikacji. Cel: crawler dociera do każdego produktu/wpisu, a śmieciowe permutacje URL-i zostają poza indeksem.
Paginacja: prawdziwe URL-e, canonical na siebie
- Każda strona dostaje prawdziwy, linkowalny URL:
/blog/page/2albo?page=2. Strona 2 musi istnieć jako HTML, o który crawler może poprosić. - Każda strona canonicalizuje się na siebie — nie na stronę 1. Canonical ze strony 2 na stronę 1 mówi Google „strona 2 to duplikat" i wszystko podlinkowane tylko ze stron 2+ po cichu wypada z odkrywania. To wciąż najczęstszy błąd paginacji.
rel="prev/next"Google wycofał w 2019 — teraz liczą się zwykłe linki<a href>między stronami (numerowane linki doprowadzają crawlera do głębokich stron szybciej niż łańcuch „tylko dalej").- Tytuły powinny się różnić: dodawaj „— Strona 2", żeby nie mnożyć duplikatów tytułów.
W Next.js strony oparte na ścieżkach mogą być w pełni statyczne:
// app/blog/page/[num]/page.tsx
export async function generateStaticParams() {
const pages = Math.ceil((await getPostCount()) / PAGE_SIZE);
return Array.from({ length: pages - 1 }, (_, i) => ({ num: String(i + 2) }));
}
Infinite scroll: w parze z prawdziwymi stronami
„Pokaż więcej" i nieskończona lista to mechaniki klienckie, a crawlery nie scrollują. Solidny wzorzec: trzymaj paginowane URL-e jako crawlowalny szkielet, aktualizuj pasek adresu przez History API w miarę scrollowania (/page/3, gdy użytkownik dotrze do trzeciej porcji), i niech każdy taki URL przy bezpośrednim wejściu renderuje swoją porcję serwerowo. Użytkownik dostaje płynny feed, crawler — strony.
Fasety: eksplozja kombinatoryczna
Kategoria z 6 filtrami po 10 wartości daje miliony permutacji URL-i. Podziel fasety na trzy poziomy:
- Warte indeksu — kombinacje z realnym popytem i stabilnym asortymentem („czerwone buty do biegania", „mieszkania z balkonem w Warszawie"). Daj im czyste statyczne ścieżki (
/running-shoes/red), unikalne tytuły i wstępy, canonical na siebie, miejsce w sitemapie. To w praktyce strony programmatic SEO — stosuj ten sam próg unikalnej wartości. - Użyteczne, ale nieindeksowalne — sortowania, suwaki cen, multiselecty. Zostaw je jako query params,
robots: { index: false, follow: true }, canonical na bazową kategorię. - Pułapki crawlu — parametry sesji, nieskończone kombinacje kalendarzy i dat. Blokuj w robots.txt, żeby w ogóle nie zjadały crawl budgetu (noindex wymaga scrawlowania każdego URL-a, żeby zostać zauważonym).
Nigdy nie pozwalaj filtrom generować linków, którymi crawler wejdzie w poziom 3 — renderuj te kontrolki jako przyciski/formularze, nie <a href>.
Checklista:
- Strony paginacji: prawdziwe URL-e, canonical na siebie, numerowane linki
<a>, różne tytuły - Zero canonicali na stronę 1; nic nie jest osiągalne wyłącznie przez infinite scroll
- Fasety podzielone na poziomy: indeksowalne / noindex,follow / blokowane w robots
- Kombinacje warte indeksu dostają statyczne ścieżki, unikalną treść i wpisy w sitemapie
- Parametry-pułapki nigdy nie są renderowane jako crawlowalne linki
<a href>