Внешний редирект средствами движка

В версии 1.1 появилась интересная (а для каких-то случаев и весьма полезная) возможность — внешний редирект.

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

За внешний редирект отвечает секция конфигурации 'router.redirect'. Там мы задаем шаблон для URL и адрес, куда нужно перенаправить этот запрос. Дополнительно можно задать код ответа сервера. И браузер (или поисковый бот) при соответствующем запросе будет перенаправлен на другой адрес.

Эта секция проверяется роутером движка сразу после разбора URL и до запуска каких-либо экшенов. И, замечу, проверяется полный URL, включая протокол.

Более подробно работу этого функционала лучше рассмотреть на конкретных примерах.

Пример 1. Перенаправление с HTTP на HTTPS
Я знаю, что такие вещи лучше делать в файле .htaccess, но вот реальный случай: если на сервере установлена панель ISPmanager версии ниже 5.2, то в .htaccess это работать не будет (там возникает циклический редирект). Но мы можем решить эту проблему, задав такие настройки:
$config['router']['redirect'] = array(
    'http://*' => 'https://*',
);
По-моему, тут все предельно ясно — «звездочка» заменяет любоую последовательность символов. И все, что приходится на «звездочку» в шаблоне, подставляется вместо «звоздочки» в целевом адресе.

Пример 2. Смена адреса страницы
Допустим, были у вас страницы по адресу http://site.com/old-path/ и вы хотите перенести их на новый адрес по адресу http://site.com/new-path/, вот только позиции в поисковиках терять не хочется. Ок, решаем проблему:
$config['router']['redirect'] = array(
    'http://site.com/old-path/*' => 'http://site.com/new-path/*.html',
);
А если это временный редирект, то добавим код 302 (по умолчанию используется код 301):
$config['router']['redirect'] = array(
    'http://site.com/old-path/*' => array('http://site.com/new-path/*.html', 302),
);

Пример 3. Раздел сайта переехал на поддомен
Был у вас блог на сайте Редирект средствами движка, который вы перенесли на поддомен blabla.site.com. Настраиваем:
$config['router']['redirect'] = array(
    'http://site.com/blog/blabla/*' => 'http://blabla.site.com/*',
);

Пример 4. Шаблон с несколькими «звездочакми»
Допустим, вы переехали на Альто с какого-то другого движка, где у вас страницы формировались так: site.com/blog/blabla/123.html

А на Альто вы хотите, чтоб страница отображалась без всяких лишних элементов вот так: site.com/123.html
$config['router']['redirect'] = array(
    'http://site.com/blog/*/*.html' => 'http://site.com/$2.html',
);
Здесь в шаблоне использованы две «звездочки», и в целевом адресе вместо '$2' будет подставлено то, что приходится на вторую «звездочку» шаблона.

Пример 5. Регулярные выражения
Допустим, вы переехали на Альто с какого-то другого движка, где у вас страницы формировались так: site.com/blog/blabla/123.html

А на Альто вы хотите, чтоб страница отображалась без всяких лишних элементов вот так: site.com/123.html

Можно это сделать и через «звоздочки», как делалось выше, но если вы умеете работать с регулярными выражениями, то можете использовать и их (важно — настоящие регулярные выражения заключаем в квадратные скобки):
$config['router']['redirect'] = array(
    '[~(.+/)/blog/([\w\-]+)/(\d+).html$~]' => '$1/$3.html',
);

Похожие статьи

  • Про секретную админку, поддомены и прочие тонкости маршрутизации в Alto CMS
    Довольно часто встречаются такие вопросы: А как сделать, чтобы админка работала не по адресу site.com/admin, а по секретному адресу, который знаю только я? Или вопрос из этой же серии: как сделать, чтоб блоги...
  • Смена урл с редиректом
    Сейчас на сайте вид ссылок https://site.ru/sample-topic.html хочу сделать https://site.ru/blog-name/123.html При изменении ссылок, все внешние ссылки отваливаются с ошибкой 404. Как правильно сделать редирект,...
  • Загрузка картинок на другой сервер и хитрый редирект
    Приветствую! Ребята, подскажет, как сделать, чтоб изображение загружались на другой сервер? Пример: имеем site.ru, а все картинки лежать и загружаются на другой сервер img.site.ru. Так же интересует, возможно ли...
  • настройки движка сбрасываются на стандартные
    По какой-то причине, настройки движка сбрасываются на стандартные… К примеру после добавления скрипта счетчика… Полностью сбрасывает на дефолт… Но не всегда, не могу точно понять при каких обстоятельствах…

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

0
А если это временный редирект, то добавим код 302 (по умолчанию используется код 303)
Я кстати так и не понял почему вы используете 303. Когда увидел это в логах был слегка удивлен, т.к. во всех других движках (с которыми сталкивался) используется 302 для обычных редиректов и 301 для постоянных (так чтобы браузер «забыл» старую ссылку).
Отредактирован:
0
Пардон, ошибся, в данном случае по умолчанию используется, конечно же, код 301. В статье исправил.

А редирект с кодом 303 используется при отправке форм, как это положено стандартом. Да, я знаю, что часто для этого код 302 используется, такая уж сложилась практика еще в те времена, когда не все клиенты поддерживали HTTP/1.1 и не понимали код 303. Но сейчас, я полагаю, таких в природе не осталось и можно уже делать не так, как когда-то повелось, а как это предписано стандартами.
комментарий был удален
комментарий был удален
комментарий был удален
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.