Вся документация
1С-Битрикс · wlit.redirect

Редиректы страниц

Модуль wlit.redirect для 1С-Битрикс выполняет постоянные перенаправления со статусом 301 Moved Permanently. Правила задаются для точных адресов или групп адресов по регулярному выражению и могут действовать на выбранном сайте либо на всех сайтах установки.

Руководство описывает версию 1.0.0. Разработчик — White Label IT.

Назначение и возможности

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

Возможности:

  • точное сопоставление пути, пути с параметрами или полного HTTP(S) URL;
  • регулярные выражения с переносом захваченных частей через $1, $2 и далее;
  • перенаправление на путь текущего сайта или внешний HTTP(S) адрес;
  • привязка к сайту и общие правила;
  • включение и выключение правил;
  • поиск и фильтры;
  • импорт и экспорт CSV.

Все правила создают 301-редирект. Выбор других статусов в текущей версии не предусмотрен.

Установка

Требования

Нужны PHP 8.1+, работающая установка 1С-Битрикс, база MySQL/MariaDB и mbstring для обработки строк импорта. Для выбора сайта в форме должен существовать активный сайт Битрикс. Установщик проверяет минимальную версию PHP.

Порядок установки

  1. Разместите модуль в /bitrix/modules/wlit.redirect/.
  2. Установите WL-IT: Редиректы страниц через административный раздел управления модулями/решениями.
  3. Откройте Сервисы → WL-IT: Редиректы страниц.
  4. Создайте тестовое правило со старого пути на новый.
  5. Проверьте HTTP-статус и заголовок Location.

Прямой адрес настроек:

/bitrix/admin/settings.php?lang=ru&mid=wlit.redirect&mid_menu=1

Обработчик включается автоматически. Правило сможет сработать, только если запрос доходит до ядра Битрикс. Адреса, которые веб-сервер обслуживает самостоятельно, например существующий статический файл, могут не проходить через модуль.

Права доступа

Уровень Возможности
D — нет доступа Административный интерфейс недоступен
R — просмотр Просмотр правил и скачивание CSV
W — управление Создание, изменение, удаление, импорт и скачивание CSV

Права на модуль общие для установки. Выбор сайта в записи ограничивает действие правила, но не является отдельным ограничением прав пользователя.

Сохранение, импорт и удаление требуют действующей сессии Битрикс. При сообщении об истёкшей сессии обновите страницу и повторите действие.

Интерфейс и поиск

Вкладка «Редиректы»

Показывает сайт, активность, исходный адрес/Regex, конечный адрес, дату изменения и кнопки действий. Общие правила отмечены прочерком в колонке сайта. Regex отмечается рядом с исходным выражением.

Список отсортирован по ID в обратном порядке: новые записи сверху. На странице — 30 правил. Порядок отображения списка не равен приоритету обработки запросов.

Доступны фильтры:

Фильтр Назначение
Сайт Показывает правила выбранного сайта вместе с общими правилами
Начальный URL Поиск части исходного URL или выражения
Конечный URL Поиск части адреса назначения
Активность Все, включённые или выключенные
Тип Все, точный URL или Regex

Нажмите Фильтровать, чтобы применить условия. Для открытия карточки нажмите строку или Изменить.

Остальные вкладки

Импорт CSV содержит загрузку файла и кнопку Скачать CSV. Документация содержит краткое руководство и ссылку на подробное описание. О разработчике — сведения о White Label IT.

Создание и управление правилами

Добавление точного редиректа

  1. Нажмите Добавить редирект.
  2. Выберите сайт.
  3. Введите начальный URL, например /old-page/.
  4. Введите конечный URL, например /new-page/.
  5. Оставьте Регулярное выражение выключенным.
  6. Включите активность и нажмите Сохранить.
  7. Проверьте старый адрес: ожидается статус 301 и Location: /new-page/.

Добавление Regex-правила

Заполните форму аналогично, включите Использовать Regex, введите выражение без разделителей, например ^/old/(.*)$, и цель /new/$1.

Выключение

Снимите Активно и сохраните. Правило остаётся в базе, но не участвует в поиске. После выключения может начать срабатывать другое подходящее правило.

Изменение и удаление

Откройте карточку, исправьте значения и сохраните. Для удаления нажмите Удалить в карточке или списке и подтвердите действие. Само содержимое исходной и конечной страниц не удаляется.

При ошибке сохранения введённые поля сохраняются в форме. К списку возвращает без сохранения текущих изменений.

Все поля и ограничения

Поле Назначение и ограничения
Сайт В обычной форме выбирается активный сайт; общие правила создаются через CSV с пустой первой колонкой
Активность Включённые правила участвуют в поиске; выключенные игнорируются
Начальный URL Обязателен; точный путь или полный HTTP(S) URL, а при Regex — выражение
Конечный URL Обязателен; начинается с /, http:// или https://; может содержать подстановки групп
Регулярное выражение Определяет способ обработки исходной строки

Начальный адрес

Для точного правила путь без первого слеша, например old/, нормализуется в /old/. Для Regex слеш автоматически не добавляется.

Максимальная длина исходной строки — 2048 байт. Для кириллицы число символов может быть меньше. Пробелы по краям удаляются. В точном исходном URL удаляются символы перевода строки.

Конечный адрес

Максимальная длина — 2048 байт. Запрещены пробелы, управляющие символы и обратный слеш. Адрес //example.ru/new/ не принимается. Для внешнего адреса указывайте протокол явно.

Примеры:

Значение Допустимость
/new/ Допустимо
https://example.ru/new/ Допустимо
/new/?page=2 Допустимо
/new/#details Допустимо, если цель отличается от текущего запроса
new/ Не принимается как конечный URL
//example.ru/new/ Не принимается
mailto:info@example.ru Не принимается

Дубликаты

Уникальность проверяется по сочетанию сайт + начальный URL + тип правила. Одинаковые исходные строки допустимы для разных сайтов и для разных типов — точного и Regex. Повторная запись с той же тройкой отклоняется независимо от её активности и конечного адреса.

Точные правила и параметры URL

Сопоставление

Точное правило проверяется для исходного REQUEST_URI, затем полного адреса текущего запроса, затем пути без параметров. Например, для запроса /old/?id=7 доступны следующие варианты:

/old/?id=7
https://example.ru/old/?id=7
/old/

Полный URL строится из протокола запроса и HTTP_HOST; протокол, домен и порт могут влиять на совпадение. Отдельный полный вариант без параметров не добавляется.

Слеш, параметры и кириллица

Порядок параметров и завершающий слеш не нормализуются. /old/, /old, /old/?a=1&b=2 и /old/?b=2&a=1 нужно рассматривать как разные исходные строки. Строки передаются в базу без изменения регистра; хеш исходного адреса делает точное сопоставление чувствительным к фактической строке.

Дополнительного декодирования кириллического пути, как в wlit.meta, нет. Для точного правила используйте вид адреса из фактического REQUEST_URI, включая percent-encoding при его наличии.

Перенос параметров

Строка запроса автоматически к конечному URL не добавляется. Правило /old/ → /new/ может сработать для /old/?utm_source=mail, но цель останется /new/.

Чтобы сохранить нужные параметры, укажите их явно в цели или используйте Regex с захватом.

Регулярные выражения

Основной синтаксис

Выражение вводится без внешних разделителей и флагов: ^/old/(.*)$, а не /^\/old\/(.*)$/i.

Конструкция Значение
^ Начало строки
$ Конец строки
(…) Захватываемая группа
.* Любая последовательность, включая пустую
[^/?]+ Один сегмент пути без / и ?
\d+ Одна или несколько цифр
\? Буквальный знак вопроса
$1, $2 в цели Содержимое первой, второй захваченной группы

Модуль использует PCRE с поддержкой Unicode. Выражение проверяется перед сохранением. Для каждого кандидата проверяются URI с параметрами, полный URL и путь без параметров.

Примеры

Задача Начальное выражение Конечный URL
Перенести раздел вместе с вложенными путями и параметрами ^/old/(.*)$ /new/$1
Перенести только пути, отбросив параметры ^/old/([^?]*)(?:\?.*)?$ /new/$1
Заменить старые карточки с числовым ID ^/item-(\d+)/?$ /catalog/$1/
Преобразовать старый параметр ID ^/old\.php\?id=(\d+)$ /catalog/$1/
Перенести раздел на другой домен ^/archive/(.*)$ https://new.example.ru/archive/$1

Проверьте каждый пример на своих фактических URL. Regex описывает строку запроса целиком; он не проверяет существование страницы назначения.

Почему рекомендуется фиксировать начало и конец

Замена выполняется через preg_replace. Если выражение совпало только с частью строки, оставшаяся часть сохраняется. Для предсказуемого полного перенаправления используйте ^ и $.

Префиксы и производительность

Для выражений, начинающихся с ^/, модуль выделяет обязательный буквальный префикс пути и использует его для отбора кандидатов. Выражения без такого начала или с альтернативой | проверяются без ограничения по префиксу. Префикс — техническая оптимизация; вручную его задавать не нужно.

Приоритет правил

Точные правила

Сначала ищутся точные совпадения, в порядке:

  1. REQUEST_URI с параметрами.
  2. Абсолютный URL текущего запроса.
  3. Путь без параметров.

Для каждого варианта правило выбранного сайта имеет приоритет перед общим. Приоритет варианта URL проверяется раньше приоритета сайта. Например, общее правило /old/?id=7 может быть выбрано раньше правила выбранного сайта /old/.

Regex-правила

Если точных совпадений нет, Regex проверяются в следующем порядке:

  1. Более длинный выделенный буквальный префикс.
  2. Правило текущего сайта перед общим правилом при одинаковой длине префикса.
  3. Меньший ID при остальных равных условиях.

Первое совпадение определяет цель. У отдельного поля «приоритет» в интерфейсе нет.

Недопустимая цель и защита от саморедиректа

После выбора проверяется итоговый URL. Если цель недопустима или совпадает с текущим запросом, перенаправление пропускается. Поиск следующего правила после такого выбора не продолжается.

Для сравнения с текущим запросом учитываются путь и параметры. Фрагмент #… не делает цель другим серверным адресом. При сравнении абсолютных URL учитываются схема, домен без учёта регистра и стандартные порты HTTP(S).

Защита предотвращает редирект на тот же запрос. Цикл из нескольких правил, например /a/ → /b/ и /b/ → /a/, нужно исключать при настройке.

Импорт и экспорт CSV

Основной формат: пять колонок

Сайт;Активность;Начальный URL / Regex;Regex;Конечный URL / Regex
s1;Y;/old/;N;/new/
s1;Y;^/archive/(.*)$;Y;/news/$1
;Y;/common-old/;N;/common-new/
№ Колонка Назначение
1 Сайт ID активного сайта, например s1; пусто — все сайты
2 Активность Y — включено, N — выключено
3 Начальный URL / Regex Исходная строка
4 Regex Y — регулярное выражение, N — точное правило
5 Конечный URL / Regex Адрес назначения с необязательными подстановками

Рекомендуется UTF-8 и разделитель ;. UTF-8 BOM поддерживается. Колонки разбираются по позиции, а не по названию.

Поддерживаемые прежние форматы

Четыре колонки:

Активность;Начальный URL;Regex;Конечный URL
Y;/old/;N;/new/
Y;^/old/(.*)$;Y;/new/$1

Две колонки, без заголовка:

/old/;/new/
/old-contacts/;/contacts/

В обоих форматах сайт остаётся пустым: правила действуют на всех сайтах установки. В двухколоночном формате все правила активны и точные.

Заголовок с первой ячейкой Начальный URL не распознаётся автоматически. Для двух колонок используйте файл без заголовка; для пяти — стандартный заголовок из примера.

Правила разбора

  • ; или , определяется по первой строке; при равенстве выбирается ;.
  • Первая строка пропускается, если первая ячейка равна Сайт, site, site_id, Активность или active, без учёта регистра.
  • Y, 1, ДА, YES включают активность и Regex. Другие значения означают выключенное состояние.
  • При пяти и более колонках используются первые пять; формат из трёх колонок не поддерживается.
  • Неизвестный непустой сайт, некорректный URL/Regex и дубликаты пропускаются.
  • Значения с разделителями, кавычками или переносами строк оформляются по правилам CSV.

Загрузка файла

  1. Откройте Импорт CSV.
  2. Выберите файл.
  3. Нажмите Импортировать.
  4. Проверьте количество добавленных и пропущенных правил.
  5. Проверьте несколько точных адресов и каждый вид Regex.

Импорт добавляет новые записи. Существующая тройка сайт + начальный URL + тип пропускается и не обновляется. Построчного отчёта с причинами пропуска нет. Импорт не выполняется как одна общая транзакция: при прерывании ранее добавленные строки могут сохраниться.

Экспорт

Нажмите Скачать CSV. Файл называется wlit-redirects-YYYY-MM-DD.csv, использует UTF-8 с BOM и разделитель ;.

Экспорт включает все правила установки, в том числе выключенные и общие, независимо от фильтра списка. Выгружается основной пятиколоночный формат, записи идут по ID по возрастанию.

Экспорт удобно хранить перед массовыми изменениями. Повторный импорт такого файла добавит отсутствующие правила, но не вернёт прежние цели у уже существующих записей. Для полного восстановления используйте резервную копию базы.

Практические сценарии

Переименование страницы

/about-old/ → /about/, Regex выключен. Создайте отдельные записи для /about-old и /about-old/, если оба адреса реально используются и не нормализуются сервером.

Перенос раздела

^/old-catalog/(.*)$ → /catalog/$1, Regex включён. Проверьте корень раздела, вложенную карточку и URL с параметрами. В этом выражении захваченный остаток может включать параметры запроса.

Исключение из общего Regex

Создайте Regex ^/old/(.*)$ → /new/$1 и отдельное точное правило /old/special/ → /special/. Точное совпадение срабатывает первым.

Разные цели на двух сайтах

Создайте точные правила /old/ → /new-ru/ для s1 и /old/ → /new-en/ для s2. Общую запись при необходимости загрузите через CSV; для того же варианта исходной строки правило текущего сайта будет иметь приоритет.

Удаление параметров

Точное правило /old/ → /new/ также может обработать /old/?utm_source=mail через вариант пути без параметров. Параметры не попадут в цель автоматически.

Перенос на другой домен

Укажите конечный адрес https://new.example.ru/new/. Для перенаправления с прежнего домена запрос должен попадать в установку Битрикс с модулем. Если старый домен обслуживает другой сервер, правило здесь не обработает его запросы.

Общие правила после миграции

Соберите пятиколоночный CSV с пустым сайтом. Импортируйте, затем проверьте правило на каждом сайте установки. Если открыть общее правило в обычной форме и сохранить с выбранным сайтом, оно станет правилом этого сайта: в выпадающем списке формы нет варианта «все сайты».

Проверка редиректов

В браузере

Откройте вкладку Network / Сеть в инструментах разработчика, включите сохранение запросов и отключение кеша, затем перейдите на старый адрес. Первый ответ должен иметь статус 301 и ожидаемый Location. Проверьте успешный ответ конечной страницы.

Через командную строку

Проверка одного ответа:

curl -I 'https://example.ru/old/'

Ожидается:

HTTP/2 301
location: /new/

Проверка всей цепочки:

curl -IL --max-redirs 10 'https://example.ru/old/'

Для ответа на GET с выводом заголовков:

curl -sS -D - -o /dev/null 'https://example.ru/old/?id=7'

Набор адресов для проверки

Проверьте исходный адрес, конечный адрес, соседний неподходящий путь, варианты со слешем и параметрами, а для общих правил — второй сайт. Конечный адрес не должен возвращаться на исходный через другое правило или настройки веб-сервера.

301 может сохраняться в кеше браузера, CDN или прокси. Если правило исправлено, а поведение кажется прежним, сравните свежий ответ через curl и очистите соответствующий кеш.

Диагностика

Симптом Возможная причина и действие
Нет доступа Проверьте права группы на модуль
Ошибка обязательных полей Заполните оба URL
Ошибка конечного URL Добавьте / или HTTP(S), уберите пробелы, // и обратный слеш
Некорректное регулярное выражение Проверьте PCRE-синтаксис; вводите без внешних разделителей
«Такой начальный URL… уже существует» Найдите запись с тем же сайтом, исходной строкой и типом
Правило не срабатывает Проверьте активность, SITE_ID, REQUEST_URI и метод GET/HEAD
Старый адрес открывает статический файл Убедитесь, что запрос проходит через Битрикс
Срабатывает другая цель Проверьте точные правила, варианты URL и порядок Regex
Параметры исчезли Они не переносятся автоматически; добавьте их в цель или захват
Подстановка $1 неожиданная Проверьте границы группы и совпадение выражения со всей строкой
После выключения осталось перенаправление Проверьте кеш, другие правила, сервер, .htaccess и CDN
«Слишком много перенаправлений» Проверьте цикл между несколькими правилами и серверными редиректами
CSV пропустил строки Проверьте сайт, формат колонок, дубликаты и валидацию URL

Частые вопросы

Можно ли создать 302, 307 или 308?

Нет. Текущий модуль выполняет только 301.

Срабатывает ли правило на POST-запрос?

Нет. Обрабатываются только GET и HEAD. Запросы отправки форм не перенаправляются этим обработчиком.

Обрабатываются ли административные адреса?

Нет. Пропускаются административный раздел, пути /bitrix/admin/ и /bitrix/tools/.

Почему точное правило /old/ работает с параметрами?

После полного URI проверяется путь без параметров. Это позволяет использовать общее точное правило для разных query string.

Можно ли управлять порядком Regex вручную?

Поля сортировки/приоритета нет. Порядок определяется длиной технического префикса, сайтом и ID. Для исключения используйте отдельное точное правило или более конкретное выражение.

Проверяется ли существование конечной страницы?

Нет. Модуль проверяет формат цели, но не загружает её. Работоспособность страницы назначения нужно проверить после сохранения.

Можно ли сделать правило для всех сайтов в форме?

Обычная форма предлагает конкретные активные сайты. Общие правила загружайте через пятиколоночный CSV с пустым сайтом либо через прежний формат.

Можно ли восстановить удалённое правило?

Встроенной отмены нет. Добавьте его заново, загрузите отсутствующую запись из CSV или восстановите базу из резервной копии.

Обновление и хранение данных

Правила хранятся в таблице b_wlit_redirect. Технические поля содержат хеш исходной строки и префикс Regex для быстрого поиска.

При открытии настроек проверяется структура таблицы. Миграция версии структуры 3 пересчитывает префиксы существующих Regex; исходные и конечные адреса не переписываются.

Перед обновлением сохраните резервную копию базы и экспорт правил. При удалении модуля таблица сохраняется; публичный обработчик отключается. Повторная установка может использовать сохранённые записи.

Информация для разработчиков

Редирект выполняет Wlit\Redirect\RedirectManager::redirectCurrentRequest() на событии main:OnBeforeProlog, через LocalRedirect($target, true, '301 Moved Permanently').

Для Regex временно ограничиваются PCRE backtrack/recursion limits; после проверки прежние значения восстанавливаются. Автоматического поиска следующего правила после недопустимой цели нет.