Реклама
Реклама
Реклама
Реклама. Zarub Zarub - зарубежные сервисы, оплата в рублях

UrlRewrite в Битрикс: ЧПУ, порядок правил и типичные ошибки

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 смотрите роутинг и контроллеры; для публичных ЧПУ инфоблоков — этот файл.