Просмотров: 10739 (Статистика ведётся с 06.02.2017)

Обработка адресов (UrlRewrite) применяется для того, чтобы скрипт мог отвечать не только по своему физическому, но и по любому другому указанному адресу. Например, можно задать такие настройки обработки адресов, что скрипт, лежащий в файле /fld/c.php и отвечающий по адресу:

/fld/c.php?id=15

будет отвечать также по адресу:

/catalog/15.php

Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.

Механизм переопределения адресов можно использовать для переопределения любых URL, а не только связанных с компонентами.

При добавлении на страницу компонента с поддержкой ЧПУ (если файл сохраняется с помощью API) автоматически создается правило переопределения адреса. Если страница создается не с помощью API, а, например, записывается через FTP, то необходимо выполнить пересоздание правил (кнопка на панели инструментов на странице управления правилами).

Управление правилами преобразования адресов производится на странице: Настройки > Настройки продукта > Обработка адресов > Правила обработки. При необходимости можно создавать правила вручную в файле urlrewrite.php в корневой папке сайта.

Для создания правил необходимо изучить хотя бы основы PCRE (Perl-совместимые регулярные выражения) и ознакомиться со всевозможными примерами разбора url-адресов с помощью масок.

Особенности работы с правилами

Система допускает создание нескольких правил для одного файла. Часто бывает лучше написать два-три понятных правила, чем объединить их через ИЛИ и сделать одно громоздкое правило "на все случаи жизни", которое непонятно как потом менять.


В Bitrix Framework правило с более длинным условием (CONDITION) применяется первым, если условие подходит. Система сортирует все правила по условиям сначала по алфавиту и длине так, чтобы применить правила с более длинными условиями первыми, как более частные. А правила с короткими условиями в следующую очередь, как более общие. Таким образом, правило для элемента ^/news/([0-9a-zA-Z_-]+)/([0-9]+)/.* будет применяться первым (как правило с более длинным условием) и, если условие не подходит, то применится правило для раздела с ^/news/([0-9a-zA-Z_-]+)/.*.

Примечание: Рекомендуется всегда добавлять .* в конец Условия если оно задано. Это не будет избыточным символом, так как без них правило не будет работать в случае добавления в строку системой дополнительных параметров. Например, при добавленном параметре ?clear_cache=Y.


Рекомендуется писать правила единообразно, так как из двух правил для раздела и детального просмотра, имеющих условия ^/news/([0-9a-zA-Z_-]+)/.* и ^/news/([\w-]+)/([\d]+)/.* не понятно, какое из правил сработает первым, поскольку длина обоих правил 26 символов и оба начинаются с /news/.

Если правило для детального просмотра элемента написано ^/news/([\w-]+)/([\d]+)/.* то и правило для просмотра раздела нужно писать аналогично ^/news/([\w-]+)/.* чтобы правила не перемешивались при автоматической сортировке. Или, если писать для просмотра элемента ^/news/([0-9a-zA-Z_-]+)/([0-9]+)/.*, то тогда и для раздела использовать ^/news/([0-9a-zA-Z_-]+)/.*.

Внимание! Придерживаться единообразия при написании правил внутри раздела важнее, чем стараться сократить количество самих правил за счёт использования ИЛИ в условии и непредсказуемо удлиняя их, сбивая сортировку правил.


Учтите, что сортировка правил по длине условий производится при изменении их через административную часть (Настройки > Настройки продукта > Обработка адресов > Правила обработки), в том числе и когда добавляется через визуальный редактор компонент с ЧПУ. А при обработке ЧПУ-запроса просто перебирается массив правил из /urlrewrite.php в той последовательности, в которой они там находятся. И поиск длится до первого совпадения. То есть, если вы вручную изменили массив ЧПУ-правил в /urlrewrite.php и разместили запись с условием #^/news/([0-9a-zA-Z_-]+)/.*# выше #^/news/([0-9a-zA-Z_-]+)/([0-9]+)/.*#, то до второго условия дело никогда не дойдет, не смотря на то, что оно длиннее.


При решения вопроса как лучше формировать ЧПУ элемента в каталоге — по ID или по символьному коду:
/catalog/poleznye_shtuki/121.html
или
/catalog/poleznye_shtuki/ochen-poleznaya-zelenaya-shtuka-s-plazmennym-nabaldashnikom-i-ruchkoi.html
учтите, что первый вариант понятнее, получение элемента по ID быстрее, чем по символьному коду, его удобнее диктовать и сложнее ошибиться. Но второй вариант гораздо выгоднее с точки зрения SEO.


Если в адресах используются численные значения ID элемента (/main/news/12/), то возможна ситуация, когда численное значение будет иметь и символьный код раздела. В этом случае правило сработает не правильно. Для детальных страниц лучше бы использовать подобный принцип: /[секции]/элемент.php, тогда и проблем с ЧПУ не будет. Например, лучше использовать условие #^/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)/([0-9]+)\.php.*#, чем условие #^/([0-9a-zA-Z_-]+)/([0-9a-zA-Z_-]+)/([0-9]+)/.*#


При наличии в URL кириллицы могут возникнуть дополнительные проблемы, связанные с тем, что диапазон русских символов не является непрерывным. В этом случае надо использовать вместо логичного для латиницы условия ^/test/([0-9a-zA-Zа-яА-Я_-]+)/.*# такой вариант: #^/test/([0-9a-zA-Zа-пр-яА-ЯёЁ_-]+)/.*#.


Примерный порядок действий, если правило должно работать, но не работает.

  1. Проверьте правильность создания правила
  2. Проверьте, возможно у вас срабатывает условие, которое находится в urlrewrite.php выше.
  3. Убедитесь, что подключается именно указанный в правиле файл, а не какой-нибудь другой.
  4. Сразу после подключения header.php добавьте для проверки код:
    echo '<pre>'.print_r($_REQUEST, true).'</pre>';
    Заодно увидите что у вас попадает в $_REQUEST.
  5. Если файл открывается правильный и в $_REQUEST порядок, тогда следует проверить параметры компонента и настройки инфоблока (доступ закрыт, деактивирован элемент, действительно нет элемента с данным ID и так далее).

Документация по теме:




20


Курсы разработаны в компании «1С-Битрикс»