Вадим Интерактивный
Разработчик на Битриксе

Учимся работать с bitrix urlrewrite

Здравствуйте, сегодня мы рассмотрим обработку адресов в системе управления сайтом 1С-Битрикс.
Из официальной документации: 'Обработка адресов UrlRewrite применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указанному адресу.' (ссылка на официальную документацию urlrewrite, обязательно ознакомьтесь).
Другими словами urlrewrite позволяет создавать ЧПУ (человекопонятный урл) на сайте.
В официальной документации все достаточно хорошо изложено, но она умалчивает о нескольких неприятных моментах, которые мы рассмотрим позже, а сейчас проведем небольшое ознакомление с содержанием urlrwrite.php в корне сайта:
$arUrlRewrite = array(
	array(
		"CONDITION"	=>	"#^/blog/post/([a-zA-Z0-9\\.\\-_]+)/?.*#",
		"RULE"	=>	"ELEMENT_CODE=$1",
		"PATH"	=>	"/blog/post.php",
	),
	array(
		"CONDITION"	=>	"#^/blog/([a-zA-Z\\.\\-_]+)/?.*#",
		"RULE"	=>	"SECTION_CODE=$1",
		"PATH"	=>	"/blog/index.php",
	),
);

Примерно так он может выглядеть.
Каждый элемент в массиве $arUrlRewrite - это,  как вы уже могли понять, отдельное правильно, где
  1. CONDITION - условие выполнения правила. Записывается правилами регулярного выражения.
  2. PATH -  адрес физической страницы, к которой мы реально будет обращаться
  3. RULE - правило замены. Его может не быть. В нем пишутся названия параметров и их значения из регулярного выражения, которые будут передаваться на физический адрес (PATH).
  4. Еще правило может содержать параметр ID, этот параметр содержит название компонента, который добавил данное правило. Как правило это название комплексного компонента.
Давайте рассмотрим на примере правило
array(
	"CONDITION"	=>	"#^/blog/post/([a-zA-Z0-9\\.\\-_]+)/?.*#",
	"RULE"	=>	"ELEMENT_CODE=$1",
	"PATH"	=>	"/blog/post.php",
)

Оно отвечает за обработку адресов /blog/post/<Символьный_код_темы>/. Кода пользователь открывает страницу со схожим адресом, он попадает на скрипт /blog/post.php, которому передается символьный код темы в переменной ELEMENT_CODE.

Думаю это понятно, теперь рассмотрим некоторые нюансы, связанные с работой файла urlrewrite.php:
  1. Если вам необходимо сделать обработку адресов для новостей таким образом, чтобы по адресу /news/10/ открывался раздел новостей с ID = 10, а по адресу /news/10/255/ сама новость с ID = 255, то менее часто срабатываемое правило для /news/10/255/ необходимо поместить 'выше', чем правило для /news/10/. Другими словами: каждое правило - это элемент массива $arUrlRewrite, и ключ массива для правила /news/10/255/ должен быть меньше, чем ключ массива для правила /news/10/. Иначе правило /news/10/255/ никогда не сработает и у вас будет постоянно открываться раздел новости, вместо самой новости. Это связано с тем, что битрикс обрабатывает правила, начиная с самого начала массива и, если условие правила соответствует запрашиваемому адресу, то он берет его и останавливается на этом.
  2. Вторая ошибка, которая может возникнуть, связана с сортировкой массива $arUrlRewrite. Каждый раз, когда вы пересохраняете настройки комплексного компонента, битрикс обновляет правила компонентов в urlrewrite.php (правила, содержание параметр ID), а также сортирует(!) элементы массива по длине условия (CONDITION). Из-за этого некоторые правила могут начать перекрывать друг-друга. Чтобы избежать такой ситуации, у добавленных правил n-раз дописывается .* в конец условия, таким образом мы устанавливаем длину условия для каждого правила и впредь можем не беспокоиться об этой сортировке.