Вообще-то, этот функционал, в какой-то степени, является аналогом механизма 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',
);
А редирект с кодом 303 используется при отправке форм, как это положено стандартом. Да, я знаю, что часто для этого код 302 используется, такая уж сложилась практика еще в те времена, когда не все клиенты поддерживали HTTP/1.1 и не понимали код 303. Но сейчас, я полагаю, таких в природе не осталось и можно уже делать не так, как когда-то повелось, а как это предписано стандартами.