Редиректы nginx. Примеры настройки перенаправлений



Рассмотрим как настраиваются редиректы nginx на примерах, которые чаще всего встречаются на практике.

Разберём:

  • редирект на другой домен
  • перенаправление с http на https
  • перенаправление на www


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



Если на сервере используется конфигурация Nginx + Apache, или подобная при которой используется более одного веб-сервера редирект всегда настраивается для того пакета, который первым обрабатывает запрос принимая его непосредственно от пользователя


netstat -nltp | grep 80


Потом меняем в команде порт 80 на 443 и проверяем повторно.

netstat -nltp | grep 443



Для большинства конфигураций в выводе будет процесс nginx.

Пример вывода представлен на скриншоте:

Редиректы nginx


Если на сервере также, то можно переходить к настройкам. Если процесс имеет имя apache, httpd, nodejs, то настройки выполняются на стороне сервиса, который указан в выводе.




Редиректы на другой домен в Nginx


В Nginx переадресация может настраиваться за счет директивы rewrite или за счет директивы return. Они взаимозаменяемы, return используется чаще потому что реже приводит к циклическим редиректам.

Циклический редирект возникает из-за конфликта настроек или конфликта настроек и кода сайта в результате которого происходит постоянная переадресация с адреса на него же.



На практике стоит проверять оба варианта: rewrite и return, и останавливаться на том, который работает. Код ответа сначала лучше устанавливать 302. После проверки менять на 301. Если ставить 301 сразу, то у пользователей, которые обратятся к сайту во время настройки может закэшироваться неверный ответ.



Пример редиректа с rewrite:


server {
listen 80;
server_name example.com;

rewrite ^ http://example-site.com$request_uri;
}



Запросы к example.com по HTTP (порт 80) будут перенаправляться на example-site.com HTTP (порт 80). За счет $request_uri; запросы будут перенаправляться не на главную страница, а в тому URL, который запросил пользователь.



В современных версиях Nginx, согласно официальной документации в Nginx redirect рекомендуется настраивать перенаправление используя return с указанием кода HTTP ответа (301 или 302)


server {
listen 80;
server_name example.com;
return 301 http://$host$request_uri;
}



Здесь приведены настройки редиректа nginx также для example.com по HTTP (порт 80), но не на определенный домен, а на домен, который запросил пользователь. Используется конструкция$host$request_uri;. Она может быть нужна для сайтов, которые доступны по нескольким доменам.



Редирект с www на без www в Nginx


Далее приведен пример настройки переадресации все запросов к страницам сайта, который доступен по адресу с www на страницы того же сайта доступного по имени без www.


server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}



Редирект с адреса без www на адрес с www можно выполнить также, меняется только значение server_name и адрес для return.



Редирект Nginx с http на https


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


или


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



В последнем случае редирект будет отрабатывать для www.example.com и example.com, все запросы будут направляться на имя без www.



Для https и порта 443 для данного домена должен существовать отдельный конфигурационный файл виртуального хоста или блок конфигурационного файла.

В нём помимо имени домена и порта 443 должны быть заданы как минимум пути к SSL сертификату и приватному ключу, путь к каталогу сайта. Про установку SSL сертификата для nginx.



Если переадресация нужна только для example.com без www, то www.example.com можно указать в качестве server_name в отдельной специально созданной секции конфигурационного файла


server {
listen 80;
server_name www.example.com;

}



Редирект со всех доменов на сервере на один


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

Сделать это можно задав две секции server и директиву default_server, под которую будут попадать все имена сайтов кроме заданных непосредственно (example.com и www.example.com в примере).


server {
listen 80;
server_name example.com www.example.com;

}



server {
listen 80 default_server;
server_name _;
return 301 http://example.com$request_uri;
}



Мы разобрали как настраиваются самые популрные редиректы nginx.

Читайте также про структуру конфигурационных файлов nginx и используемые сервисом контексты.

Сказать спасибо