В битриксе часто приходиться помучиться при настройки ЧПУ, особенно при настройки комплексных компонентов. Что бы решить эту проблему, надо разобраться с файлом под названием urlrewrite.php который лежит в корневой папки сайта.
'#^/bitrix/services/ymarket/#', 'RULE' => '', 'ID' => '', 'PATH' => '/bitrix/services/ymarket/index.php', 'SORT' => 100, ), array ( 'CONDITION' => '#^/baza-znaniy/', 'RULE' => '', 'ID' => '', 'PATH' => '/baza-znaniy/index.php', 'SORT' => 100, ), array ( 'CONDITION' => '#^/baza-znaniy/([a-zA-Z\\.\\-_]+)/?.*#', 'RULE' => 'SECTION_CODE=$1', 'ID' => '', 'PATH' => '/baza-znaniy/list.php', 'SORT' => 200, ), array ( 'CONDITION' => '#^/baza-znaniy/([a-zA-Z\\.\\-_]+)/([a-zA-Z\\.\\-_]+)/?.*#', 'RULE' => 'SECTION_CODE=$1&ELEMENT_CODE=$2', 'ID' => '', 'PATH' => '/baza-znaniy/detail.php', 'SORT' => 200, ), );
Примерно так выглядит файл urlrewrite.php.Каждый элемент в массиве $arUrlRewrite – это, отдельное правильно, где
CONDITION – условие выполнения правила. Записывается правилами регулярного выражения.
PATH – адрес физической страницы, к которой мы реально будет обращаться
RULE – правило замены. Его может не быть. В нем пишутся названия параметров и их значения из регулярного выражения, которые будут передаваться на физический адрес (PATH).
Еще правило может содержать параметр 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:
Если вам необходимо сделать обработку адресов для новостей таким образом, чтобы по адресу /news/10/ открывался раздел новостей с ID = 10, а по адресу /news/10/255/ сама новость с ID = 255, то менее часто срабатываемое правило для /news/10/255/ необходимо поместить ‘выше’, чем правило для /news/10/. Другими словами: каждое правило – это элемент массива $arUrlRewrite, и ключ массива для правила /news/10/255/ должен быть меньше, чем ключ массива для правила /news/10/. Иначе правило /news/10/255/ никогда не сработает и у вас будет постоянно открываться раздел новости, вместо самой новости. Это связано с тем, что битрикс обрабатывает правила, начиная с самого начала массива и, если условие правила соответствует запрашиваемому адресу, то он берет его и останавливается на этом.
Вторая ошибка, которая может возникнуть, связана с сортировкой массива $arUrlRewrite. Каждый раз, когда вы пересохраняете настройки комплексного компонента, битрикс обновляет правила компонентов в urlrewrite.php (правила, содержание параметр ID), а также сортирует(!) элементы массива по длине условия (CONDITION). Из-за этого некоторые правила могут начать перекрывать друг-друга. Чтобы избежать такой ситуации, у добавленных правил n-раз дописывается .* в конец условия, таким образом мы устанавливаем длину условия для каждого правила и впредь можем не беспокоиться об этой сортировке.