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 дней гарантии