ЧПУ поверх ЧПУ
Недавно я занимался переносом сайта с самодельного движка на битрикс. В круг задач, помимо сохранения внешнего вида и функционала, входила задача сохранения некоторых ссылок, по которым проводилось продвижение.
На сайте был самый простой и самый сердитый вид ЧПУ, из всех известных мне, — ссылки, а точнее полные пути, вручную забивались для каждой страницы. Разумеется, в битриксе всё иначе, поэтому старые ссылки сохранить было невозможно.
Обычно в таких случаях довольствуются 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, то лучше подобные махинации проделать в нём.
Еще потому что в битриксе нельзя делать элементы с одинаковым кодом, но в разных секциях; потому что, при выборке элемента, на код секции он не обращает внимания.
И еще много подобных нюансов, обусловленных принципиально разными подходами к ЧПУ.