Как создать временные и постоянные перенаправления с помощью Nginx

Введение

HTTP-перенаправление – это способ указать один домен или адрес на другой. Существует несколько различных видов перенаправлений, каждое из которых имеет свое значение для веб-браузера клиента. Два наиболее распространенных типа – это временные и постоянные перенаправления.

Временные перенаправления (код состояния ответа 302 Найдено) полезны, если URL временно должен обслуживаться из другого местоположения. Например, если вы выполняете техническое обслуживание сайта, вы можете использовать временное перенаправление с вашего домена на страницу объяснения, чтобы информировать посетителей о том, что вы скоро вернетесь.

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

В этом руководстве будет рассмотрено более подробное объяснение того, как реализовать каждый вид перенаправления в Nginx, а также приведены примеры для конкретных случаев использования.

Предварительные требования

Чтобы следовать этому руководству, вам понадобится:

  • A server with Nginx installed and set up to serve your website(s). You can find some examples and instructions on the tutorials for Ubuntu 22.04, Debian, or CentOS.

Решение в двух словах

В Nginx большинство перенаправлений можно осуществить с помощью встроенной директивы rewrite. Эта директива доступна по умолчанию при свежей установке Nginx и может использоваться для создания как временных, так и постоянных перенаправлений. В самой простой форме она принимает как минимум два аргумента: старый URL и новый URL.

Вы можете реализовать временное перенаправление с помощью следующих строк в конфигурации вашего сервера:

Temporary redirect with rewrite
server {
    . . .
    server_name www.domain1.com;
    rewrite ^/$ http://www.domain2.com redirect;
    . . .
}

Это перенаправление указывает браузеру направлять все запросы для www.domain1.com на www.domain2.com. Однако это решение работает только для одной страницы, а не для всего сайта. Чтобы перенаправить более одной страницы, вы можете использовать директиву rewrite с регулярными выражениями, чтобы указать целые каталоги вместо одиночных файлов.

redirect совпадает с шаблонами регулярных выражений в скобках. Затем он ссылается на совпадающий текст в пункте назначения перенаправления, используя выражение $1, где 1 – это первая группа совпадающего текста. В более сложных примерах последующие совпадающие группы нумеруются последовательно.

Например, если вы хотите временно перенаправить каждую страницу в www.domain1.com на www.domain2.com, вы можете использовать следующее:

Temporary redirect with rewrite
server {
    . . .
    server_name www.domain1.com;
    rewrite ^/(.*)$ http://www.domain2.com/$1 redirect;
    . . .
}

server {
    . . .
    server_name www.domain2.com;
    . . .
}

По умолчанию директива rewrite устанавливает временное перенаправление. Если вы хотите создать постоянное перенаправление, вы можете сделать это, заменив redirect на permanent в конце директивы, как показано ниже:

Permanent redirects
rewrite ^/$ http://www.domain2.com permanent;
rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;

Давайте перейдем к некоторым конкретным примерам.

Пример 1 — Переход на другой домен

Если у вас уже есть веб-присутствие и вы хотите изменить свой домен на новый адрес, лучше всего не просто покидать старый домен. Закладки на ваш сайт и ссылки на ваш сайт, размещенные на других страницах в Интернете, перестанут работать, если ваш контент исчезнет без каких-либо инструкций браузеру о том, как найти его новое местоположение. Изменение доменов без перенаправления приведет к потере трафика на вашем сайте от предыдущих посетителей и старых ссылок.

В этом примере мы настроим перенаправление с старого домена, называемого domain1.com, на новый домен, называемый domain2.com. Здесь мы будем использовать постоянные перенаправления, потому что старый домен будет отключен, и весь трафик должен идти на новый домен.

Допустим, у вас настроен веб-сайт для обслуживания с одного домена, называемого domain1.com, уже настроенный в Nginx следующим образом:

/etc/nginx/sites-available/domain1.com
server {
    . . .
    server_name domain1.com;
    . . .
}

Мы также предположим, что вы уже обслуживаете вашу будущую версию веб-сайта на domain2.com:

/etc/nginx/sites-available/domain2.com
server {
    . . .
    server_name domain2.com;
    . . .
}

Давайте изменить файл конфигурации блока сервера domain1.com, чтобы добавить постоянное перенаправление на domain2.com:

/etc/nginx/sites-available/domain1.com
server {
    . . .
    server_name domain1.com;
    rewrite ^/(.*)$ http://domain2.com/$1 permanent;
    . . .
}

Мы добавили вышеупомянутое перенаправление, используя директиву rewrite. Регулярное выражение ^/(.*)$ соответствует всему после / в URL. Например, http://domain1.com/index.html будет перенаправлен на http://domain2.com/index.html. Чтобы добиться постоянного перенаправления, мы просто добавляем permanent после директивы rewrite.

Примечание: Не забудьте протестировать вашу конфигурацию, используя nginx -t, а затем перезапустить Nginx после внесения изменений.

Пример 2 — Создание постоянного опыта несмотря на изменения имени одностраничника

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

Допустим, на вашем сайте были две отдельные страницы для продуктов и услуг под названиями products.html и services.html соответственно. Теперь вы решили заменить эти две страницы на одну общую страницу предложений под названием offers.html. Мы настроим простое перенаправление для products.html и services.html на offers.html.

Мы предполагаем, что ваш сайт настроен следующим образом:

Original server block configuration
server {
    . . .
    server_name example.com www.example.com;
    . . .
}

Настройка перенаправлений сводится к использованию двух директив перенаправления.

Redirects added to the original configuration
server {
    . . .
    server_name example.com www.example.com;
    
    rewrite ^/products.html$ /offer.html permanent;
    rewrite ^/services.html$ /offer.html permanent;
    . . .
}

Директива rewrite принимает исходный адрес, который должен быть перенаправлен, а также адрес назначения новой страницы. Поскольку изменение здесь является постоянным, мы также использовали permanent в директиве. Вы можете использовать столько перенаправлений, сколько пожелаете, чтобы убедиться, что ваши посетители не увидят ненужных ошибок 404 Not Found при перемещении содержимого сайта.

Вывод

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

Существует множество других применений HTTP-перенаправлений, включая принудительное использование безопасных SSL-соединений (т.е. использование https вместо http) и убедиться, что все посетители окажутся только на адресе сайта с префиксом www..

Использование перенаправлений правильно позволит вам использовать ваше текущее веб-присутствие, давая вам возможность модифицировать структуру вашего сайта при необходимости. Если вы хотите узнать больше о способах, с помощью которых вы можете направлять своих посетителей, у Nginx отличная документация по этой теме в разделах модуль перезаписи официальной документации и официальном блоге о создании перенаправлений.

Source:
https://www.digitalocean.com/community/tutorials/how-to-create-temporary-and-permanent-redirects-with-nginx