Немного о редиректах в nginx

Существует замечательный веб-сервер nginx, созданные небезызвестным товарищем Игорем Сысоевым. Но речь сейчас не о нем, а о части проблем, с которыми я столкнулся после переезда с apache.
Одна из проблем состоит в том, что необходимо было реализовать апачевскую конструкцию:
RewriteCond %{HTTP_HOST} ^example.com RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Эта конструкция делала постоянный редирект с адреса вида http://example.com/folder/file на соответствующую страницу http://www.example.com/folder/file. Это может понадобиться как для склейки доменов «в глазах» поисковых серверов, так и для удобства пользователей: иногда неудобно, что часть ходит на один домен, а часть – на другой.
Оказалось, что в nginx это реализуется гораздо проще и логичнее, с помощью модуля ngx_http_rewrite_module и его директивы if.
В его конфигурации конструкция выглядит так:
if ($host ~* ^example\.com$) { rewrite ^(.*)$ http://www.example.com$1 permanent; }
После изменения последнего варианта под конкретные нужды, у меня получилось вот что:
if ($host !~* ^alexander\.mokrov\.info$) { rewrite ^(.*)$ http://alexander.mokrov.info$1 permanent; }
Этот вариант перенаправляет пользователей со всех доменов, прописанных как server_name (т.к. правило действует в пределах этого server) на один конкретный вариант – alexander.mokrov.info.
В качестве иллюстрации работы – можете прямо сейчас изменить в адресной строке alexander.mokrov.info на www.mokrov.info. Сервер автоматически перенаправит ваш браузер обратно.
upd: Товарищ point ниже в комментах подсказывает, что то же самое правильнее сделать вот таким способом:
server *.mokrov.info { location / { rewrite ^ http://alexander.mokrov.info permanent; } } server alexander.mokrov.info { …… }3 Комментариев
3 Комментариев
Оставить комментарий
if в nginx — непомерное зло. Напомнишь, при встрече, я тебе руку оторву за это
Я бы сделал так
server *.mokrkov.info
{
location /
{
rewrite ^ http://alexander.mokrov.info permanent;
}
}
server alexander.mokrov.info
{
……
}
Эх, проблемы с отступами…
Угу, сенькс, добавил в текст с индентами