Yandex Metrika
sanches.free 22 просмотра

SEO для сайта на 1С-Битрикс: дубли по домену и слэшу, пагинация (часть 1)

Зачем эта заметка

В публичной части 1С-Битрикс типовые сео-пожелания сводятся к тому, чтобы поиск видел один понятный адрес каждого документа, без зеркал по поддомену и без пар «со слэшем / без слэша». Второй пласт — аккуратно обслужить многостраничные списки: связать страницы пагинации, не раздувать индекс пустыми дублями и не отдавать 200 на несуществующий номер.

Выбор канонического имени хоста

Сначала договоритесь на уровне команды и аналитики: основной ли это домен с префиксом www или «голый» apex. После решения задача решается постоянными редиректами на веб-сервере, а не костыльными метатегами в шаблоне. Ниже — пример для nginx при выборе варианта «все на www»; для противоположного случая логика такая же, меняются только условие и адрес назначения.

server {
    listen 443 ssl;
    server_name "~^(?!www\.).+";
    return 301 $scheme://www.$host$request_uri;
}

В Apache семейство получают парой RewriteCond по %{HTTP_HOST} и одним правилом с кодом 301; главное — не смешивать два канонических варианта одновременно и проверять цепочку на проде после правок конфигурации.

Обязательный слэш в конце «папочных» путей

Если в ЧПУ раздел без завершающего слеша и с ним считаются разными входами в каталог выдачи, закрепите редирект на один вид. Простое правило уровня nginx:

rewrite ^([^.]*[^/])$ $1/ permanent;

Исключайте конфликты с реальными файлами расширениями (расширенный шаблон в проекте обычно уточняют под фактические маршруты). На Apache аналог — редирект по шаблону URI к тому же пути со слэшем.

ЧПУ и разметка пагинации

Удобочитаемые адреса вида /catalog/page2/ чаще собирают обвязкой вокруг компонента списка и обработкой SITE_DIR-urlrewrite; готовые разборы по шаблонам регулярок легко найти в материалах сообщества — важно один раз зафиксировать формат и не плодить разные паттерны в разных местах кодовой базы.

В шаблоне навигации (system.pagenavigation) можно добавить цепочку rel и сигнал для роботов на страницах после первой. Подставьте реальные URL категории и соседних страниц из того же блока параметров компонента, а не литералы с плейсхолдерами:

global $APPLICATION;

$arNavParams = []; // параметры вашего шаблона пагинации
// ...
if ((int)$arResult['NavPageNomer'] === 2) {
    $APPLICATION->SetPageProperty('robots', 'noindex, follow');
    $APPLICATION->AddHeadString('<link rel="prev" href="https://site.example/category/">');
} elseif ((int)$arResult['NavPageNomer'] > 2) {
    $APPLICATION->SetPageProperty('robots', 'noindex, follow');
    $APPLICATION->AddHeadString('<link rel="prev" href="https://site.example/category/page' . ((int)$arResult['NavPageNomer'] - 1) . '/">');
}

if ((int)$arResult['NavPageNomer'] < (int)$arResult['NavPageCount']) {
    $APPLICATION->AddHeadString('<link rel="next" href="https://site.example/category/page' . ((int)$arResult['NavPageNomer'] + 1) . '/">');
}

$pagenQueryKey = 'PAGEN_' . (int)$arResult['NavNum'];
$requested = isset($_GET[$pagenQueryKey]) ? (int)$_GET[$pagenQueryKey] : 0;

if ($requested > 0 && (int)$arResult['NavPageNomer'] !== $requested) {
    define('ERROR_404', 'Y');
    return;
}

При включённой поддержке свойства заголовка в теме добавьте суффикс с номером страницы в обработчике на OnEpilog, чтобы не ломать остальной жизненный цикл приложения:

AddEventHandler('main', 'OnEpilog', static function (): void {
    global $APPLICATION;

    if (defined('ERROR_404') && constant('ERROR_404') === 'Y') {
        return;
    }

    $requested = isset($_GET['PAGEN_1']) ? (int)$_GET['PAGEN_1'] : 0;
    if ($requested > 0) {
        $baseTitleProp = trim((string)$APPLICATION->GetPageProperty('title'));
        if ($baseTitleProp !== '') {
            $APPLICATION->SetPageProperty('title', $baseTitleProp . ' — страница ' . $requested);
        }
    }
});

Индекс ключа PAGEN_* должен совпадать с номером компонента в конкретном шаблоне; при нескольких независимых листингах на одной странице выбирайте нужный индекс осознанно.

Кратко

Канон домена и хвостового слэша закрепляют на уровне веб-сервера; в шаблоне пагинации добавляют rel, robots, отсекают «фантомные» номера через ERROR_404, а номер выдачи отражают в заголовке страницы через OnEpilog.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии