Примеры редиректов в NGINX

Настройки необходимо вносить в файлах конфигураций виртуальных доменов. В Linux, как правило, они расположены в директории /etc/nginx/conf.d/. Во FreeBSD все в одном файле — /usr/local/etc/nginx/nginx.conf.

Саму настройку на перенаправление в NGINX можно прописать двумя способами:

rewrite ^ https://$host$request_uri? <флаг>;

$host — имя хоста из запроса, если отсутствует — имя в поле «Host» заголовка, если тоже отсутствует — имя сервера; $request_uri — первоначальный запрос с аргументами (все, что идет после доменного имени).
** где флаги могут быть следующие:

return <код> https://$host$request_uri;

* где коды могут использоваться любые, но чаще всего — 301, 302, 404.

Есть различные мнения, какой из методов лучше и безопаснее, поэтому каким воспользоваться — решать по ситуации. В данных примерах используется второй вариант.

После внесения изменений, необходимо проверить их корректность:

nginx -t

И для их применения перезапустить веб-сервер:

systemctl restart nginx

service nginx restart

* в первом примере перезапуск выполняется на новых системах Linux. Второй пример — на устаревших или FreeBSD.

Проверяя редиректы в браузере, следует учесть, что настройки могут кэшироваться. Для обновления кэша используйте комбинацию Ctrl + F5. Если и это не помогает, закрывайте вкладку и открывайте новую.

С HTTP на HTTPS

server {
        listen 80;
        server_name domain.ru www.domain,ru;
        return 301 https://$host$request_uri;
}

* в данном примере для всех обращений к сайту domain.ru по 80 порту (http) будет работать редирект на 443 порт (https) с кодом 301 (для склеивания доменов).

С одного домена на другой

server {
        ...
        server_name domain1.ru;
        return 302 http://domain2.ru$request_uri;
}

C домена без www на домен с www

server {
        ...
        server_name domain.ru;
        return 301 http://www.$host$request_uri;
}

C index.php на /

server {
        ...
        if ($request_uri ~ "^(.*)index\.(?:php|html)") {
                return 301 $1;
        }
}

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

Если обращение к веб-серверу идет по IP-адресу или домену, который не прописан в конфигурационном файле, можно перенаправить весь трафик на домен по умолчанию:

server {
        listen 80 default_server;
        return 302 https://welcome.domain.ru$request_uri;

или независимо от протокола:

server {
        listen 80 default_server;
        return 302 $scheme://welcome.domain.ru$request_uri;
}

server {
        listen 443 default_server;
        return 302 $scheme://welcome.domain.ru$request_uri;

        ssl on;
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;
}

$scheme позволяет перевести запрос на тот же протокол (http или https), по которому он был инициирован.
** если nginx должен слушать и обрабатывать запросы по https, необходимо указывать в настройках пути к сертификатам.

На другой сервер

Пример внутреннего перенаправления http-запроса на другой веб-сервер:

...
location / {
            proxy_pass $scheme://192.168.0.15:8080/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}

* в данном случае, принимать запросы от браузера и отвечать на них будет NGINX, а сама обработка будет выполняться на сервере с IP-адресом 192.168.0.15 на порту 8080.

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

server {
        ...
        server_name  domain domain.*;
        return 301 https://$host$request_uri;
}

Немного о 301 и 302

В чем принципиальная разница между ответом с кодом 301 и 302? Для обычного посетителя сайта разницы нет. А вот для поискового робота разница огромная.

301-й редирект говорит о склеивании страниц. Это означает для поисковика то, что старая и новая страницы — это одно и тоже. Таким образом результаты ранжирования необходимо сохранить для новой страницы.

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

# Сервера # Интернет # UNIX # NGINX
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет