UrlRewrite в 1С-Битрикс нужен, чтобы физический PHP-скрипт отвечал не только по своему пути, но и по ЧПУ. Правила лежат в /urlrewrite.php (в корне сайта) в массиве $arUrlRewrite: ядро перебирает их сверху вниз и на первом совпадении CONDITION останавливается.
Ниже — рабочая структура правила, порядок (почему деталка должна быть выше раздела), как комплексный компонент перезаписывает файл и какие ошибки встречаются чаще всего. Входящий URI после rewrite читайте уже через Application / Context / Request или привычный Application::getInstance()->getContext()->getRequest() — не парсите $_SERVER['REQUEST_URI'] вручную в бизнес-логике.
Структура urlrewrite.php
<?php
$arUrlRewrite = [
[
'CONDITION' => '#^/blog/post/([a-zA-Z0-9.\-_]+)/?#',
'RULE' => 'ELEMENT_CODE=$1',
'PATH' => '/blog/post.php',
],
[
'CONDITION' => '#^/blog/([a-zA-Z.\-_]+)/?#',
'RULE' => 'SECTION_CODE=$1',
'PATH' => '/blog/index.php',
],
[
'CONDITION' => '#^/company/news/#',
'RULE' => '',
'ID' => 'bitrix:news',
'PATH' => '/company/news/index.php',
],
];
Поля правила:
- CONDITION — регулярное выражение к URI (обычно с якорем
#^...). - PATH — физический скрипт, который реально выполняется.
- RULE — подстановки в query-string (
ELEMENT_CODE=$1). Может быть пустым. - ID — имя комплексного компонента, который «владеет» правилом. При пересохранении настроек компонента Битрикс обновляет такие записи.
Пример: /blog/post/code/ → post.php
Правило с ELEMENT_CODE=$1 отвечает за адреса вида /blog/post/my-post/. Пользователь открывает ЧПУ, ядро подключает /blog/post.php, а в запросе появляется параметр ELEMENT_CODE=my-post. Дальше компонент или страница читает код через Request, а не через разбор URI.
Порядок правил: деталка выше списка
Битрикс берёт первое совпавшее правило и останавливается. Если нужно, чтобы /news/10/255/ открывало элемент, а /news/10/ — раздел, более специфичное правило (с элементом) должно стоять выше в массиве. Иначе сработает короткое правило раздела, и деталка никогда не откроется.
Сортировка после сохранения компонента
При пересохранении настроек комплексного компонента ядро обновляет правила с полем ID и часто сортирует массив по длине CONDITION. Из‑за этого кастомные правила могут начать перекрывать друг друга. Практический приём: у нужных CONDITION дописывают хвост вроде .*, чтобы зафиксировать длину и переживать автосортировку. Свои ручные правила без ID помечайте комментарием в файле и держите бэкап urlrewrite.php в git.
Типичные ошибки
- Слишком жадный шаблон
(.*)выше остальных — перехватывает чужие URL. - Забыли якорь начала
^— правило срабатывает на «хвосте» чужого пути. - Правило раздела стоит выше деталки — ЧПУ элемента никогда не откроется.
- Правили файл руками, затем сохранили компонент — потеряли кастомные CONDITION.
- Путают urlrewrite и роутинг D7 (
local/routes) — это разные механизмы; API-контроллеры модулей обычно живут в routing, публичная ЧПУ — в urlrewrite.
Заключение
UrlRewrite — тонкий слой: CONDITION → PATH + RULE. Держите специфичные правила выше, не отдавайте файл целиком на милость автосохранения компонента без бэкапа, а параметры после rewrite читайте через D7 Request. Для модульного HTTP API смотрите роутинг и контроллеры; для публичных ЧПУ инфоблоков — этот файл.

