Назад

Оптимизация SEO для постраничной навигации в Битрикс

Главная
Блог
Оптимизация SEO для постраничной навигации в Битрикс

При работе с каталогами товаров, новостями или любыми другими разделами сайта на Битрикс, где используется постраничная навигация, важно правильно настроить SEO-разметку. Это помогает поисковым системам корректно индексировать контент и избежать проблем с дублированием страниц.

Основные принципы SEO для пагинации

  1. Canonical URL — должен указывать на текущую страницу с очищенными параметрами пагинации

  2. Prev/Next — помогают поисковым системам понять структуру разбиения на страницы

  3. Уникальные мета-теги — для каждой страницы пагинации должны быть свои title и description

  4. ЧПУ — желательно использовать человеко-понятные 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-рекомендации

  1. Nofollow для ссылок пагинации
    Добавьте в шаблон компонента для ссылок пагинации атрибут rel="nofollow":

    <a href="<?=$arResult['NAV_RESULT']->GetPageHref($pageNumber)?>" rel="nofollow"><?=$pageNumber?></a>

  2. 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>');
    }

  3. Ограничение индексации
    Для страниц пагинации после определенного номера (например, после 10) можно добавить:

    if ($pageNum > 10) {
        $APPLICATION->AddHeadString('<meta name="robots" content="noindex, follow">');
    }

  4. Интеграция с sitemap.xml
    Исключите страницы пагинации из карты сайта, оставив только первую страницу.

Проверка и валидация

После реализации:

  1. Проверьте разметку через Google Rich Results Test

  2. Убедитесь, что в Search Console нет ошибок дублирования

  3. Проверьте корректность отображения мета-тегов в соцсетях (используя Facebook Sharing Debugger)

Заключение

Правильная настройка SEO для постраничной навигации в Битрикс требует комплексного подхода. Реализация описанных методов поможет:

  • Избежать проблем с дублированием контента

  • Улучшить индексацию разделов сайта

  • Повысить релевантность страниц в поисковой выдаче

  • Обеспечить корректное отображение в социальных сетях

Регулярно проверяйте актуальность рекомендаций, так как алгоритмы поисковых систем постоянно развиваются.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи