Листинги категорий, архивы блога и отфильтрованные выдачи генерируют больше URL, чем весь остальной сайт вместе взятый, — и большинство из них не должно индексироваться. Именно здесь умирает краул-бюджет и рождаются настоящие проблемы дублей. Цель: краулер достаёт каждый товар/пост, а мусорные перестановки URL остаются вне индекса.
Пагинация: настоящие URL, canonical на себя
- Каждая страница получает настоящий, линкуемый URL:
/blog/page/2или?page=2. Вторая страница должна существовать как HTML, который краулер может запросить. - Каждая страница канонизируется на себя — не на первую. Canonical со второй страницы на первую говорит Google «страница 2 — дубль», и всё, что подлинковано только со страниц 2+, тихо выпадает из обнаружения. Это до сих пор самая частая ошибка пагинации.
rel="prev/next"Google похоронил ещё в 2019-м — теперь важны обычные<a href>-ссылки между страницами (нумерованные ссылки доводят краулер до глубоких страниц быстрее, чем цепочка «только вперёд»).- Тайтлы должны различаться: добавляйте «— Страница 2», чтобы не плодить дубли заголовков.
В Next.js страницы по путям можно сделать полностью статическими:
// 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: в паре с настоящими страницами
«Показать ещё» и бесконечная лента — клиентские механики, а краулеры не скроллят. Надёжный паттерн: держите пагинированные URL как обходимый скелет, обновляйте адресную строку через History API по мере скролла (/page/3, когда пользователь дошёл до третьей порции), и пусть каждый такой URL при прямом заходе рендерит свою порцию на сервере. Пользователь получает плавную ленту, краулер — страницы.
Фасеты: комбинаторный взрыв
Категория с 6 фильтрами по 10 значений даёт миллионы перестановок URL. Разложите фасеты на три яруса:
- Достойные индекса — комбинации с реальным спросом и стабильным ассортиментом («красные беговые кроссовки», «квартиры с балконом в Варшаве»). Дайте им чистые статические пути (
/running-shoes/red), уникальные тайтлы и вступления, canonical на себя, место в sitemap. По сути это programmatic SEO-страницы — применяйте ту же планку уникальной ценности. - Полезные, но не индексируемые — сортировки, ползунки цены, мультиселекты. Оставьте их query-параметрами,
robots: { index: false, follow: true }, canonical на базовую категорию. - Ловушки обхода — сессионные параметры, бесконечные комбинации календарей и дат. Блокируйте в robots.txt, чтобы они вообще не ели краул-бюджет (noindex требует обойти каждый URL, чтобы его увидеть).
Никогда не давайте фильтрам генерировать ссылки, по которым краулер уйдёт в третий ярус, — рендерите эти контролы кнопками/формами, а не <a href>.
Чеклист:
- Страницы пагинации: настоящие URL, canonical на себя, нумерованные
<a>-ссылки, разные тайтлы - Никаких canonical на первую страницу; ничто не достижимо только через infinite scroll
- Фасеты разложены на ярусы: индексируемые / noindex,follow / заблокированные в robots
- Достойные индекса комбинации получают статические пути, уникальный контент и sitemap
- Параметры-ловушки никогда не рендерятся обходимыми
<a href>-ссылками