Рассмотрим как настраиваются редиректы nginx на примерах, которые чаще всего встречаются на практике.
Разберём:
- редирект на другой домен
- перенаправление с http на https
- перенаправление на www
Прежде чем начать настройки убедимся в том, что их нужно выполнять именно для Nginx.
Если на сервере используется конфигурация Nginx + Apache, или подобная при которой используется более одного веб-сервера редирект всегда настраивается для того пакета, который первым обрабатывает запрос принимая его непосредственно от пользователя
netstat -nltp | grep 80
Потом меняем в команде порт 80 на 443 и проверяем повторно.
netstat -nltp | grep 443
Для большинства конфигураций в выводе будет процесс 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 и используемые сервисом контексты.