суббота, 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. И не забывайте хранить копию этого файла "в шаговой доступности".


2 комментария:

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

    ОтветитьУдалить