Skip to content

Instantly share code, notes, and snippets.

@if0rest
Last active June 19, 2024 17:53
Show Gist options
  • Save if0rest/272840352c27e2c38e5df7cccc55bead to your computer and use it in GitHub Desktop.
Save if0rest/272840352c27e2c38e5df7cccc55bead to your computer and use it in GitHub Desktop.
Учимся работать с bitrix urlrewrite

Здравствуйте, сегодня мы рассмотрим обработку адресов в системе управления сайтом 1С-Битрикс. Обработка адресов UrlRewrite применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указанному адресу. Другими словами, urlrewrite позволяет создавать ЧПУ.

   $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",
      ),
      array(
         "CONDITION" => "#^/company/news/(.*)/#",     // плохой шаблон, просто до кучи пример с ID
         "RULE"      => "ELEMENT_CODE=$1",
         "ID"        => "bitrix:news",
         "PATH"      => "/company/news/detail.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-раз дописывается .* в конец условия, таким образом мы устанавливаем длину условия для каждого правила и впредь можем не беспокоиться об этой сортировке.

Visit http://web.archive.org/web/20201201210506/https://ftdev.ru/blog/post/uchimsya-rabotat-s-bitrix-urlrewrite/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment