ЧПУ поверх ЧПУ

Недавно я занимался переносом сайта с самодельного движка на битрикс. В круг задач, помимо сохранения внешнего вида и функционала, входила задача сохранения некоторых ссылок, по которым проводилось продвижение.

На сайте был самый простой и самый сердитый вид ЧПУ, из всех известных мне, — ссылки, а точнее полные пути, вручную забивались для каждой страницы. Разумеется, в битриксе всё иначе, поэтому старые ссылки сохранить было невозможно.

Обычно в таких случаях довольствуются 301 редиректом со старых адресов на новые, вручную прописывая их в .htacceess’е. Но наш случай сложнее: нужно было непременно сделать так, чтобы по старым ссылкам открывались страницы без всяких редиректов.

Как же заставить битрикс думать, что к нему пришли по новому адресу, когда на самом деле в браузере был вбит старый? Решение простое: чтобы понять, какой контент показать, движок анализирует запрос, а именно переменную $_SERVER['REQUEST_URI']. Так давайте её подменим еще до того как движок вступит в дело. Тогда, если в этой переменной окажется старый адрес, то мы его поменяем на новый и битрикс покажет нам нужную страницу. Для этого нужно изменить в .htaccess строчки

RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]

на

RewriteCond %{REQUEST_FILENAME} !/bitrix/old2new.php$
RewriteRule ^(.*)$ /bitrix/old2new.php [L]

Это перенаправит все запросы на несуществующие файлы в наш скрипт /bitrix/old2new.php, где мы сможем легко изменить переменную $_SERVER['REQUEST_URI'] и после этого передать управление битриксу подключив файл /bitrix/urlrewrite.php:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/urlrewrite.php");

Получилось такое своеобразное проксирование. Кстати, если на сервере есть nginx, то лучше подобные махинации проделать в нём.

#1
Kola
22.03.2011 15:12
А почему бы просто не добавить нужное правило в /urlrewrite.php (тот что редактируется через Настройки -> Настройки продукта -> Обработка адресов)?
#2
@LEXXX_NF
22.03.2011 15:25
Например, потому что многоуровневую вложенность секций битрикс разобрать не сможет, как правила ни пиши.
Еще потому что в битриксе нельзя делать элементы с одинаковым кодом, но в разных секциях; потому что, при выборке элемента, на код секции он не обращает внимания.
И еще много подобных нюансов, обусловленных принципиально разными подходами к ЧПУ.
#3
Kola
23.03.2011 09:07
Да, все так.
#4
Андрей
14.10.2013 09:38
Добрый день! Спасибо большое за статью! Она мне очень помогла, и сэкономила много времени
#5
Алилуйя!
07.07.2016 02:07
Спасибо, наконец-то нормально работающее решение

Писáть здесь