Битрикс. Система обработки адресов
Обработка адресов (UrlRewrite) применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указаному адресу. Например, можно задать настройки обработки адресов, чтобы скрипт в файле /folder/index.php , отвечающий по адресу
Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.
Правила обработки
Правила обработки адресов настраиваются отдельно для каждого сайта и хранятся в корне сайта в файле urlrewrite.php . Файл содержит массив $arUrlRewrite , каждая запись которого является правилом обработки адреса. Файл urlrewrite.php имеет следующий вид:
$arUrlRewrite = array ( array ( 'CONDITION' => '#^/catalog/category/([^/]+?)/\\??(.*)#', 'RULE' => 'SECTION_CODE=$1&$2', 'ID' => 'bitrix:catalog.section', 'PATH' => '/catalog/section.php', 'SORT' => 100, ), array ( 'CONDITION' => '#^/catalog/product/([^/]+?)/\\??(.*)#', 'RULE' => 'ELEMENT_CODE=$1&$2', 'ID' => 'bitrix:catalog.element', 'PATH' => '/catalog/element.php', 'SORT' => 100, ), );
Каждое правило должно содержать уникальное в рамках сайта условие выполнения правила. Условие выполнения записывается в ключ CONDITION массива и является шаблоном регулярного выражения. Например, условие:
указывает, что данное правило должно применяться для всех адресов, которые начинаются с подстрок вида:
Правило может содержать адрес физически существующего скрипта, который будет подключен при выполнении условия. Этот адрес записывается в ключ PATH . Например, если в системе обработки адресов зарегистрировано правило:
array( 'CONDITION' => '#^/gallery/#', 'PATH' => '/users/images/index.php', )
и пользователь запросил URL
которого физически не существует, то система обработки адресов подключит скрипт:
Правило может содержать строку замены, которая записывается в ключ RULE . Если строка замены установлена, то адрес реально существующего подключаемого скрипта формируется заменой регулярным выражением условия выполнения (шаблона выражения) на конкатенацию физического пути (ключ PATH ) и строки замены (ключ RULE ). Например, если в системе обработки адресов зарегистрировано правило:
array( 'CONDITION' => '#^/forum/(4+)/(8+)/#', 'RULE' => 'mode=read&CID=$1&GID=$2', 'PATH' => '/forum/index.php', )
и пользователем запрошена страница:
то для формирования адреса скрипта, который будет подключен, выполнится код:
$url = preg_replace( '#^/index/(6+)/(6+)/#', '/forum/index.php?mode=read&CID=$1&GID=$2', '/index/17/23/' );
/forum/index.php?mode=read&CID=17&GID=23
Правило может содержать имя компонента, который создал это правило. Это имя записывается в ключ ID . При автоматическом пересоздании файла правил urlrewrite.php с помощью средств административной части сайта пересоздаются только правила, у которых заполнен ключ ID .
Подключение системы обработки адресов
Перед началом использования система обработки адресов должна быть подключена на сайте. Для этого необходимо:
- если на веб-сервере настроена обработка ошибки 404 (например, для Apache установлена директива ErrorDocument 404 /404.php ), то надо изменить файл 404.php в корне сервера, вставив в самое начало:
include_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php';
RewriteEngine On RewriteCond % !-f RewriteCond % !-l RewriteCond % !-d RewriteCond % !/bitrix/urlrewrite.php$ RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (146)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (68)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (62)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (140)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (105)
- Установка (66)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
Система обработки адресов
Обработка адресов UrlRewrite применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указаному адресу. Например, можно задать настройки обработки адресов, чтобы скрипт в файле /folder/index.php , отвечающий по адресу:
Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.
Правила обработки
Правила обработки адресов настраиваются отдельно для каждого сайта и хранятся в корне сайта в файле urlrewrite.php . Файл содержит массив $arUrlRewrite , каждая запись которого является правилом обработки адреса. Файл urlrewrite.php имеет следующий вид:
$arUrlRewrite=array ( 0 => array ( 'CONDITION' => '#^/blog/htaccess/([0-9a-zA-Z-]+)/[\\?]?[0-9a-zA-Z=_-]*#', 'RULE' => 'CODE=$1', 'ID' => '', 'PATH' => '/blog/htaccess/detail.php', 'SORT' => 100, ), );
Каждый элемент в массиве $arUrlRewrite это, как вы уже могли понять, отдельное правильно, где:
- CONDITION условие выполнения правила, записывается правилами регулярного выражения
- RULE правило замены, его может не быть. В нем пишутся названия параметров и их значения из регулярного выражения, которые будут передаваться на физический адрес PATH
- ID этот параметр содержит название компонента, который добавил данное правило. Как правило это название комплексного компонента
- PATH адрес физической страницы к которой реально будет обращение
- SORT сортировка правила в массиве, для правильной сортировки нужно проставить числа в нужном порядке в самом файле urlrewrite.php и сохранить изменения, после сохранения файла нужно запустить Пересоздание правил в административном разделе
Настройка ЧПУ для вывода страниц через компонент
Для начала в настройках инфоблока пропишем шаблоны ссылок на разделы и товары:
Затем в корне сайта создадим файлик urlrewrite.php :
$arUrlRewrite=array ( 0 => array ( 'CONDITION' => '#^/blog/htaccess/([0-9a-zA-Z-]+)/[\\?]?[0-9a-zA-Z=_-]*#', 'RULE' => 'CODE=$1', 'ID' => '', 'PATH' => '/blog/htaccess/detail.php', 'SORT' => 100, ), );
В файле detail.php подключен news.detail , в index.php — шаблон компонента news.list .
Незабудем в настройках компонента news.detail добавить параметр «Код новости» для правильной обработки:
Подключение системы обработки адресов
Перед началом использования система обработки адресов должна быть подключена на сайте.
Если на веб-сервере настроена обработка ошибки 404 (например, для Apache установлена директива ErrorDocument 404 /404.php ), то надо изменить файл 404.php в корне сервера, вставив в самое начало:
include_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php';
Если для Apache используеся модуль mod_rewrite , то в .htaccess надо указать:
RewriteEngine On RewriteCond % !-f RewriteCond % !-l RewriteCond % !-d RewriteCond % !/bitrix/urlrewrite.php$ RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
Работа с utm-метками
Если почитать документацию, то можно увидеть, что condition для обработчика рекомендуется писать в виде:
Этот подход плох тем, что к такому адресу не добавить utm-метки. А в режиме администрирования битрикс сам добавляет GET-параметры страницы, что приводит к невалидности страницы Элемент не найден в случае компонента bitrix:catalog.section .
В простом случае можно дописать правило таким образом, что с GET-параметрами админки и utm-метками страница валидна, но также она будет валидна с мусором. Например, ссылка /blog/page/blablabla будет валидной и страница откроется, однако тут должна быть 404 ошибка. Потенциально это может привести к страницам-дублям в поисковиках, а этого стоит избегать:
Для правильной работы стоит писать правило так, что бы страница была валидной в чистом виде и с GET-параметрами :