При работе с каталогами товаров, новостями или любыми другими разделами сайта на Битрикс, где используется постраничная навигация, важно правильно настроить SEO-разметку. Это помогает поисковым системам корректно индексировать контент и избежать проблем с дублированием страниц.
Основные принципы SEO для пагинации
-
Canonical URL — должен указывать на текущую страницу с очищенными параметрами пагинации
-
Prev/Next — помогают поисковым системам понять структуру разбиения на страницы
-
Уникальные мета-теги — для каждой страницы пагинации должны быть свои title и description
-
ЧПУ — желательно использовать человеко-понятные URL для страниц
Настройка rel canonical и rel prev/next
Создайте файл component_epilog.php в папке вашего компонента:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
if (!defined('ERROR_404') && !defined('IS_SEO_PAGE')) {
$protocol = (CMain::IsHTTPS()) ? 'https://' : 'http://';
$currentUrl = $APPLICATION->GetCurDir();
// Очищаем URL от параметров пагинации для canonical
$canonicalParams = array_filter(
$_GET,
function($key) { return strpos($key, 'PAGEN_') !== 0; },
ARRAY_FILTER_USE_KEY
);
$canonicalUrl = $currentUrl;
if (!empty($canonicalParams)) {
$canonicalUrl .= '?'.http_build_query($canonicalParams);
}
$APPLICATION->AddHeadString('<link rel="canonical" href="'.$protocol.$_SERVER["HTTP_HOST"].$canonicalUrl.'">');
// Обработка пагинации
if (isset($arResult['NAV_RESULT'])) {
$nav = $arResult['NAV_RESULT'];
// Next page
if ($nav->NavPageNomer < $nav->NavPageCount) {
$nextPageUrl = $currentUrl.'?PAGEN_'.$nav->NavNum.'='.($nav->NavPageNomer + 1);
$APPLICATION->AddHeadString('<link rel="next" href="'.$protocol.$_SERVER["HTTP_HOST"].$nextPageUrl.'">');
}
// Prev page
if ($nav->NavPageNomer > 1) {
$prevPageUrl = ($nav->NavPageNomer == 2)
? $currentUrl
: $currentUrl.'?PAGEN_'.$nav->NavNum.'='.($nav->NavPageNomer - 1);
$APPLICATION->AddHeadString('<link rel="prev" href="'.$protocol.$_SERVER["HTTP_HOST"].$prevPageUrl.'">');
}
}
}Обработка ЧПУ-пагинации
Для современных сайтов рекомендуется использовать ЧПУ вида /page-2/ вместо параметров ?PAGEN_1=2. Добавьте в component_epilog.php:
// Обработка ЧПУ пагинации (/page-XX/)
if (preg_match('#/page-(\d+)/#', $currentUrl, $matches)) {
$pageNum = $matches[1];
$baseUrl = str_replace($matches[0], '/', $currentUrl);
// Next page
if ($pageNum < $nav->NavPageCount) {
$nextPageUrl = $baseUrl.'page-'.($pageNum + 1).'/';
$APPLICATION->AddHeadString('<link rel="next" href="'.$protocol.$_SERVER["HTTP_HOST"].$nextPageUrl.'">');
}
// Prev page
if ($pageNum > 1) {
$prevPageUrl = ($pageNum == 2) ? $baseUrl : $baseUrl.'page-'.($pageNum - 1).'/';
$APPLICATION->AddHeadString('<link rel="prev" href="'.$protocol.$_SERVER["HTTP_HOST"].$prevPageUrl.'">');
}
// Canonical для ЧПУ
$APPLICATION->AddHeadString('<link rel="canonical" href="'.$protocol.$_SERVER["HTTP_HOST"].$baseUrl.'">');
}Динамическое обновление мета-тегов
Добавьте в init.php обработчик для изменения мета-информации:
AddEventHandler("main", "OnEndBufferContent", "updateMetaForPagination");
function updateMetaForPagination(&$content) {
$pageNum = false;
// Определяем номер страницы для стандартной пагинации
if (preg_match('/PAGEN_(\d+)=(\d+)/', $_SERVER['QUERY_STRING'], $matches)) {
$pageNum = $matches[2];
}
// Определяем номер страницы для ЧПУ
elseif (preg_match('#/page-(\d+)/#', $_SERVER['REQUEST_URI'], $matches)) {
$pageNum = $matches[1];
}
if ($pageNum) {
// Обновляем Title
if (strpos($content, '<title>') !== false) {
$content = preg_replace(
'/(<title>.*?)(<\/title>)/is',
'$1 — Страница '.$pageNum.'$2',
$content
);
}
// Обновляем Description
if (strpos($content, 'name="description"') !== false) {
$content = preg_replace(
'/(<meta name="description" content=")(.*?)("\/?>)/is',
'$1$2 — Страница '.$pageNum.'$3',
$content
);
} else {
$content = str_replace(
'</head>',
'<meta name="description" content="Страница '.$pageNum.'"></head>',
$content
);
}
// Обновляем H1
if (strpos($content, '<h1') !== false) {
$content = preg_replace(
'/(<h1.*?>.*?)(<\/h1>)/is',
'$1 — Страница '.$pageNum.'$2',
$content
);
}
}
}Дополнительные SEO-рекомендации
-
Nofollow для ссылок пагинации
Добавьте в шаблон компонента для ссылок пагинации атрибутrel="nofollow":<a href="<?=$arResult['NAV_RESULT']->GetPageHref($pageNumber)?>" rel="nofollow"><?=$pageNumber?></a>
-
JSON-LD разметка
Для улучшения понимания структуры сайта поисковыми системами:if (isset($arResult['NAV_RESULT'])) { $nav = $arResult['NAV_RESULT']; $jsonLd = [ '@context' => 'https://schema.org', '@type' => 'ItemList', 'numberOfItems' => $nav->NavRecordCount, 'itemListElement' => [] ]; $APPLICATION->AddHeadString('<script type="application/ld+json">'.json_encode($jsonLd).'</script>'); }
-
Ограничение индексации
Для страниц пагинации после определенного номера (например, после 10) можно добавить:if ($pageNum > 10) { $APPLICATION->AddHeadString('<meta name="robots" content="noindex, follow">'); }
-
Интеграция с sitemap.xml
Исключите страницы пагинации из карты сайта, оставив только первую страницу.
Проверка и валидация
После реализации:
-
Проверьте разметку через Google Rich Results Test
-
Убедитесь, что в Search Console нет ошибок дублирования
-
Проверьте корректность отображения мета-тегов в соцсетях (используя Facebook Sharing Debugger)
Заключение
Правильная настройка SEO для постраничной навигации в Битрикс требует комплексного подхода. Реализация описанных методов поможет:
-
Избежать проблем с дублированием контента
-
Улучшить индексацию разделов сайта
-
Повысить релевантность страниц в поисковой выдаче
-
Обеспечить корректное отображение в социальных сетях
Регулярно проверяйте актуальность рекомендаций, так как алгоритмы поисковых систем постоянно развиваются.