суббота, 2 февраля 2013 г.

Bitrix и urlrewrite

Недавно потребовалось в интернет-магазине на Битриксе отображать урлы с русскими буквами, например, /catalog/Коллекция_Collection-Name
Для этого пришлось подредактировать файл urlrewrite.php и добавить следующее правило:
"CONDITION" => "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_\\-]+)$#",
"RULE" => "SECTION_CODE=$1",
"PATH" => "/store/collection.php",
Казалось бы, это все. Но нет. Так как сайт работал в кодировке utf-8, то Битрикс нагло игнорировал "узнавание" русских букв. Данная проблема (как и в большинстве случаев) решается установкой флага u. В итоге, правило приобретает такой вид:
"CONDITION" => "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_\\-]+)$#u",
"RULE" => "SECTION_CODE=$1",
"PATH" => "/store/collection.php",
Теперь Битрикс работает как надо.

Еще немного трюков:
1. Редирект с множества вариантов урлов:
"CONDITION" => "#^/(service|shops|contacts|warranty|rules)$#",
"RULE" => "v=1",    // чит, чтобы заставить PATH воспринимать регулярное выражение
"PATH" => "/info/$1/index.php",
Таким образом ссылки /service, /shops, /contacts, /warranty, /rules будут вести на соответствующие индексные файлы в подкаталогах каталога /info.

2. Учет дополнительных параметров в урлах
Если Ваша схема урлов довольно чувствительна к передаваемым параметрам, например:
"CONDITION" => "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_\\-]+)$#",
"RULE" => "SECTION_CODE=$1",
"PATH" => "/store/collection.php",
То попытка перейти по ссылке /catalog/Коллекция_Collection-Name?clear_cache=Y вызовет у Битрикса когнитивный диссонанс и как результат 404-ю ошибку. Чтобы он воспринимал такие урлы правильно, делаем так:
"CONDITION" => "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_\\-]+)(.*)$#",
"RULE" => "SECTION_CODE=$1&$2",
"PATH" => "/store/collection.php",
Теперь Битрикс адекватно воспринимает все передаваемые GET-параметры и без проблем обновляет кеш.

3. Совершенно феерический номер - обработка урлов со слешами. Например: /catalog/Коллекция_S/S-2013
Одно из решений следующее: перед выводом урла в страницу кодируем его urlencode. При этом слеши будут заменены на выражение %2F. Теперь заменяем обычным str_replace %2F на %252F. Rewrite-правило принимает такой вид:
"CONDITION" => "#^/catalog/([a-zA-Z0-9а-яёА-ЯЁ_(\%2F)\\-]+)$#u",
"RULE" => "SECTION_CODE=$1",
"PATH" => "/store/collection.php",
Теперь в скрипт обработки передается значение SECTION_CODE равное "Коллекция_S/S-2013".

Ну и финальный совет: сам битрикс очень любит перекроить файл urlrewrite.php так как хочется ему при любой удобной возможности.
Если в ваших настройках реврайтов очень важен порядок и вы не желаете неожиданных изменений, то можно поставить файлу urlrewrite.php права только на чтение - 0444 или совсем строго - только на чтение владельцу - 0400. И не забывайте хранить копию этого файла "в шаговой доступности".


5 комментариев:

  1. Отличная заметка, мне помогло вот это в конце строки. Теперь и гет-параметры работают, и лишнего не вписать в ссылку.

    ОтветитьУдалить
  2. Для ссылок http://site.ru/articles/%3FELEMENT_ID%3D77777 выдает 404 ошибку. Возможно исправить это правилами?

    ОтветитьУдалить
    Ответы
    1. Откуда у вас такие ссылки?
      %3F это ?, %3D это =. В итоге это понимаемая любым браузером ссылка типа articles/?FELEMENT_ID=77777.
      Проверьте, не происходит ли где-нибудь url-кодирования ссылки?

      Удалить
    2. Такие ссылки указали на сторонних сайтах и при переходе получается 404 ошибка, сеошники ругаются.. Возможно исправление таких кодированных символов правилом?

      Удалить