Система обработки адресов
Обработка адресов UrlRewrite
применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указаному адресу. Например, можно задать настройки обработки адресов, чтобы скрипт в файле /folder/index.php
, отвечающий по адресу:
/folder/index.php?id=15
Отвечал по адресу:
/folder/item/15/
Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.
Правила обработки
Правила обработки адресов настраиваются отдельно для каждого сайта и хранятся в корне сайта в файле 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
в$_REQUEST
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
надо указать:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
</IfModule>
Работа с utm-метками
Если почитать документацию, то можно увидеть, что condition
для обработчика рекомендуется писать в виде:
#^/blog/(\w+)/#
Этот подход плох тем, что к такому адресу не добавить utm-метки. А в режиме администрирования битрикс сам добавляет GET-параметры страницы, что приводит к невалидности страницы Элемент не найден
в случае компонента bitrix:catalog.section
.
В простом случае можно дописать правило таким образом, что с GET-параметрами админки и utm-метками страница валидна, но также она будет валидна с мусором. Например, ссылка /blog/page/blablabla
будет валидной и страница откроется, однако тут должна быть 404 ошибка. Потенциально это может привести к страницам-дублям в поисковиках, а этого стоит избегать:
#^/blog/(\w+)/.*#
Для правильной работы стоит писать правило так, что бы страница была валидной в чистом виде и с GET-параметрами :
#^/blog/(\w+)/($|\?.+$)#