Включили SEF_MODE в компоненте новостей или каталога, а детальные страницы отдают 404 от nginx или открывают раздел вместо элемента? На 1С-Битрикс: Управление сайтом (это не Bitrix24) ЧПУ работает цепочкой из трёх слоёв: веб-сервер передаёт запрос в urlrewrite.php, роутер выбирает физический файл, компонент разбирает хвост URL. Ниже – пошаговая настройка .htaccess, SEF_MODE и правил CONDITION/RULE/PATH без путаницы с 301-редиректами.
ЧПУ в Битрикс – это маршрутизация, а не переезд страниц. Веб-сервер (.htaccess или nginx) отправляет "несуществующие" пути в /bitrix/urlrewrite.php; массив $arUrlRewrite выбирает PATH; компонент с SEF_MODE=Y читает символьные коды из URL. Правило создаётся при сохранении страницы с компонентом – после FTP-заливки откройте страницу в редакторе или нажмите "Пересоздать правила". 301 после смены структуры – отдельная задача, не urlrewrite.
ЧПУ (человекопонятный URL) – адрес вида /catalog/smartfony/iphone-15/ вместо /catalog/?SECTION_ID=12&ELEMENT_ID=255. Путать его с редиректами опасно: urlrewrite только "находит" нужный PHP-файл, а не говорит поисковику "страница переехала". Если после миграции с WordPress в .htaccess остался RewriteRule на index.php – Битрикс даже не получит запрос.
Разведите маршрутизацию, редиректы и ЧПУ фильтра
Делайте urlrewrite, когда нужны красивые пути к существующим страницам каталога, новостей, блога. Не делайте: пихать в urlrewrite.php правила "старый URL → новый" – для этого есть SEO-модуль и серверные 301.
| Задача | Инструмент | Куда смотреть |
|---|---|---|
| Красивый путь /news/release/ | SEF_MODE + urlrewrite.php | Эта статья |
| Старый URL → новый после смены структуры | 301 (SEO-модуль, .htaccess) | 301-редиректы на Битрикс (B48) |
| ЧПУ в умном фильтре каталога | Отдельные шаблоны SEF фильтра | умный фильтр (B24) |
| Страница удалена без замены | HTTP 404, не редирект | страница 404 (B23) |
Рекомендация: сначала добейтесь рабочих ЧПУ через urlrewrite, потом добавляйте 301 для старых адресов. Два слоя на один путь – частая причина циклов и "страница не та".
Настройте цепочку .htaccess или nginx до urlrewrite.php
Веб-сервер не знает про каталог Битрикс – он только решает, отдать файл или передать запрос в PHP. Если mod_rewrite выключен или try_files смотрит на index.php – получите 404 от сервера, хотя в админке "ЧПУ включено".
Схема запроса:
Браузер → /catalog/phones/ → сервер не находит папку → /bitrix/urlrewrite.php → совпадение CONDITION → PATH (например /catalog/index.php) → компонент парсит хвост URL
На Apache в корневом .htaccess должен быть блок mod_rewrite с передачей в urlrewrite, а не в index.php:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
На nginx (часто на VPS у Beget или другом провайдере) базовая строка:
try_files $uri $uri/ /bitrix/urlrewrite.php?$args;
Пошаговая проверка после правки конфига:
- Откройте терминал и выполните
curl -I https://ваш-сайт.ru/catalog/test-chpu/– смотрите, кто отдал 404 (nginx/Apache или PHP). - Если статус 404 и в теле нет шапки сайта – проблема на слое сервера, urlrewrite ещё не вызывался.
- Убедитесь, что в 404.php подключён стандартный include
bitrix/modules/main/include/urlrewrite.php. - На shared-хостинге проверьте, что mod_rewrite включён в панели – без него .htaccess молчит.
- После смены конфига перезапустите nginx или дождитесь применения .htaccess и сбросьте кеш браузера.
Не делайте: копировать из WordPress правило RewriteRule ^(.*)$ /index.php [L] – оно обходит роутер Битрикс.
Разберите структуру правила в urlrewrite.php
Файл лежит в корне сайта (при многосайтовости – отдельный на каждый сайт). Внутри массив $arUrlRewrite: Битрикс перебирает записи сверху вниз и останавливается на первом совпадении CONDITION.
| Поле | Назначение | Типичная ошибка |
|---|---|---|
| CONDITION | Регулярка пути, например #^/catalog/# | Слишком широкое правило "съедает" детальные |
| RULE | Захват групп из URL (опционально) | Пустой RULE там, где нужны параметры |
| PATH | Физический файл: /catalog/index.php | Путь к несуществующей странице |
| ID | Имя компонента (bitrix:catalog) | Несовпадение с компонентом на странице |
| SORT | Порядок в админке (в файле – позиция в массиве) | Раздел выше детальной – откроется список |
Делайте: более специфичные CONDITION (детальная страница) выше общих (раздел). Не делайте: править SORT в админке, не понимая, что в файле важен порядок ключей массива.
Включите SEF_MODE и символьные коды в компоненте
Частая боль: "включил ЧПУ в инфоблоке" – а URL всё ещё с ID. SEF_MODE, SEF_FOLDER и SEF_URL_TEMPLATES настраиваются в комплексном компоненте на странице, не в типе инфоблока.
- Задайте символьные коды разделам и элементам – см. создание инфоблока (B28).
- Откройте страницу каталога или новостей в визуальном редакторе, выберите компонент.
- Включите SEF_MODE = Y, укажите SEF_FOLDER (например /catalog/).
- В шаблонах URL замените #SECTION_ID# на #SECTION_CODE#, #ELEMENT_ID# на #ELEMENT_CODE#.
- Сохраните страницу – правило в urlrewrite.php создастся автоматически.
- Проверьте детальную и раздел: оба URL должны отдавать HTTP 200.
Для вывода раздела каталога с корректными путями смотрите гайд по catalog.section (B62). Рекомендация: после смены шаблонов очистите кеш и откройте страницу в режиме инкогнито.
Пересоздайте правила после FTP и для своего компонента
Залили сайт по FTP, включили SEF_MODE в коде – а в urlrewrite.php пусто? Правило появляется при сохранении страницы через API редактора. Альтернатива: Настройки → Настройки продукта → Настройки модулей → Главный модуль → вкладка "Обработка адресов" → "Пересоздать правила".
Для кастомного компонента с ЧПУ – свой компонент (B63): CComponentEngine::ParseComponentPath и ручная запись в urlrewrite или класс UrlRewriterRuleMaker в D7. Делайте бэкап urlrewrite.php перед ручным редактированием – сохранение компонента в админке может перезаписать ваши строки.
Не делайте: править urlrewrite на боевом без бэкапа и без теста на копии. После любой ручной правки – очистка кеша (Настройки → Производительность).
Диагностируйте 404, конфликты правил и мягкий 404 Битрикс
404 от сервера (пустая страница nginx) и "мягкий" 404 Битрикс (статус 200, но шаблон ERROR_404) – разные истории. Первый лечится .htaccess/nginx, второй – настройками компонента и страницей 404 (B23).
- Детальная открывает раздел – поднимите правило детальной выше в массиве или пересоздайте правила.
- Все ЧПУ-URL битые – проверьте mod_rewrite и путь к /bitrix/urlrewrite.php.
- Работает только главная – конфликт с чужим .htaccess после миграции.
- Многосайтовость – у каждого сайта свой urlrewrite.php в корне документа.
С 2026 года Битрикс продвигает routing_index.php и local/routes/web.php для D7-контроллеров – это параллельная ветка, не замена SEF комплексных компонентов на классическом сайте. Для типового каталога и новостей urlrewrite остаётся рабочим стандартом; routing смотрите, если пишете свои Engine\Controller без физических страниц.
Нужна помощь с диагностикой на боевом проекте – обсудим задачу. Похожие кейсы – в портфолио.
Автор: Максим Мольков, разработчик 1С-Битрикс.
Источники: справка по обработке адресов, курс по ЧПУ и символьным кодам, практика внедрений на CMS.
Частые вопросы
Где лежит urlrewrite.php в Битрикс?
В корне документа сайта (рядом с index.php). При многосайтовости – отдельный файл в корне каждого сайта. Не путайте с /bitrix/urlrewrite.php – это обработчик ядра, а не ваш массив правил.
Чем urlrewrite отличается от правил в .htaccess?
.htaccess только решает: отдать файл или передать запрос в /bitrix/urlrewrite.php. Массив $arUrlRewrite внутри CMS выбирает, какой PHP-файл и компонент обработают путь. Редиректы 301 в .htaccess – другой слой, см. гайд B48.
Почему ЧПУ выдаёт 404, хотя SEF_MODE включён?
Три частые причины: нет RewriteRule на /bitrix/urlrewrite.php, правило не создалось после FTP (сохраните страницу с компонентом), порядок правил в urlrewrite.php – раздел перекрывает детальную. Проверьте curl -I и содержимое urlrewrite.php.
Как добавить правило в urlrewrite вручную?
Откройте urlrewrite.php, добавьте элемент массива с CONDITION, PATH, ID. Либо используйте админку "Обработка адресов", либо UrlRewriterRuleMaker в коде. После правки – бэкап, очистка кеша, проверка детальной и раздела.
Нужно ли включать "Использовать ЧПУ" в настройках продукта?
Галочка в главном модуле – базовое разрешение. Реальные URL задаёт SEF_MODE в компоненте и шаблоны с символьными кодами. Без сохранения страницы с компонентом правило в urlrewrite не появится.
ЧПУ на nginx: что проверить на VPS?
В location для PHP: try_files с fallback на /bitrix/urlrewrite.php$is_args$args, а не на index.php. После смены конфига – nginx -t и reload. На новом VPS удобно сразу взять шаблон конфига у хостера, например Beget, и адаптировать под домен.