Как сделать URL перенаправление (redirecting) в Nginx?

Часто случается, что владельцы меняют адрес своего сайта (домен) на другой, это может быть связанно с разными причинами, предположим, освободился более красивый и удачный домен и т.д. Первым делом, что нужно сделать владельцу сайта — это позаботится о том, чтобы все пользователи, которые запрашивают страницы старого ресурса (сайта) попадали на новый. Осуществить это можно с помощью перенаправлений.

Есть несколько типов перенаправлений: постоянные, временные и специальные. В данном случае нас интересует постоянное перенаправление — оно подразумевает, что оригинальный URL-адрес больше не должен использоваться, а вместо него должен быть использован новый. В последствии роботы сделают замену в своих индексах старого сайта на новый. Различаются эти типы HTTP перенаправлений друг от друга статусом в виде ответов специального кода 3 x x

В нашем случае, при редиректе на новый домен, должен быть быть ответ с кодом 301 (Moved Permanently) — в буквальном понимании «переехал навсегда».

Постоянное перенаправление (код ответа сервера 301) будет полезен в следующих случаях:

  • когда доменное имя вашего веб-сайта изменилось
  • когда вы хотите, чтобы клиенты видели в браузере канонический формат URL-адреса (с префиксом www или наоборот без него )
  • когда вы хотите отловить распространенные орфографические ошибки в вашем доменном имени и пренаправить на истинный

Для решения этих задач подойдут директивы return и rewrite. Существует в Nginx и еще одна полезная директива try_files, но в решении нашей задачи она не уместна.

Что лучше использовать return или rewrite? Опять же, в решении нашей задачи return предпочтительнее rewrite. А rewrite стоит использовать в более хитрых задачах, которые требуют подхода с регулярными выражениями.

Перенаправление на новое доменное имя

Директива return объявляется в контексте server или location, указывающие на URL-адреса, которые должны быть перезаписаны. Вот очень простой пример, который перенаправляет клиентов на новое доменное имя:

server {
    listen 80;
    listen 443 ssl;
    server_name old-name.com www.old-name.com;
    return 301 $scheme://new-name.com$request_uri;
}

Добавление и удаление префикса www

Примеры ниже добавляют и удаляют к основному домену префикс www :

# добавляем 'www'
server {
    listen 80;
    listen 443 ssl;
    server_name domain.com;
    return 301 $scheme://www.domain.com$request_uri;
}

# удаляем 'www'
server {
    listen 80;
    listen 443 ssl;
    server_name www.domain.com;
    return 301 $scheme://domain.com$request_uri;
}

Перенаправление всех запросов на схему протокола HTTPS

Этот пример блока <strong>server</strong> заставляет всех посетителей использовать защищенное (SSL/TLS) соединение с вашим сайтом:

server {
    listen 80;
    server_name domain.com;
    return 301 https://domain.com$request_uri;
}

А вот как это перенаправление будет выглядеть с использованием директивы rewrite:

# НЕ РЕКОМЕНДУЕТСЯ
if ($scheme != "https") {
    rewrite ^ https://www.mydomain.com$uri permanent;
}

Из примера видно, что это намного хитрее и не целесообразно, так как этот метод требует от веб-сервера дополнительной обработки, NGINX должен будет проверить прежде if-условие, а уже потом обработать регулярное выражение в значении rewrite директиве.