Персональный блог Александра Мокрова

О работе и отдыхе

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

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 Комментариев

  1. point Март 2nd, 2010 23:20

    if в nginx — непомерное зло. Напомнишь, при встрече, я тебе руку оторву за это :)

    Я бы сделал так

    server *.mokrkov.info
    {
    location /
    {
    rewrite ^ http://alexander.mokrov.info permanent;
    }
    }
    server alexander.mokrov.info
    {
    ……
    }

  2. point Март 2nd, 2010 23:20

    Эх, проблемы с отступами…

  3. Александр Мокров Март 3rd, 2010 00:00

    Угу, сенькс, добавил в текст с индентами :)

Оставить комментарий