Редиректы NGINX (bitrixVM)

В отличие от сервера Apache2, в случае использования Nginx не существует файла .htaccess для настройки переадресаций. Однако вы можете настроить редирект, отредактировав файлы конфигурации виртуальных доменов.

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

  • в дистрибутивах, основанных на RPM (CentOS, Red Hat) — /etc/nginx/conf.d/.
  • в дистрибутивах, основанных на Debian (Ubuntu, Debian) — /etc/nginx/sites-enabled/

Применение настроек

Для настройки редиректов на веб-сервере Nginx необходимо выполнить два последовательных действия:

  • Добавить код в конфигурационный файл
  • Проверить нет ли ошибок в крнф. файле
  • Перезагрузить nginx

Проверка

nginx -t

Перезагрузка Nginx

Для новых версиях Linux

systemctl restart nginx

Для устаревших версий и FreeBSD

service nginx restart

Настройка редиректа

  1. Первый представляет собой строку:
rewrite ^ https://$host$request_uri? <flag>

Здесь переменная $host является хостом из запросов. Если он отсутствует, следует воспользоваться именем заголовка в поле «Host», если и его нет — подойдет имя сервера.

Переменная $request_uri — это первоначальный запрос с аргументами.

При настройке можно выбрать следующие флаги (<flag>):

  • permanent — 301 редирект (или постоянный редирект) на страницу с кодом ответа сервера 301.
  • redirect — 302 редирект (или временный редирект) на страницу с кодом 302.
  • last — завершение обработки и последующий переходом в новый location.
  • break — завершение обработки и работа в текущем location.

2.

return <code> https://$host$request_uri;

Здесь можно использовать любой код редиректа, однако самые распространенные случаи — 301, 302, 404.

Примеры часто используемых редиректов

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

Это наиболее распространенное перенаправление, которое позволяет направить весь трафик непосредственно на домен, минуя поддомены.

# www.domen -> domen
server {
server_name www.[domain];
return 301 $scheme://[domain]$request_uri;
}

Перенаправление на «www» c «без www»

server {
server_name [domain];
return 301 $scheme://www.[domain]$request_uri;
}

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

location / {
rewrite ^(.*)$ $scheme://new-domain.com/$1 redirect;
}

Или

location / {
return 301 $scheme://$http_host$request_uri;
}

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

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

Редирект на другой сервер

...
    location / {
    proxy_pass $scheme://192.168.0.12: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.12 (порт 8080). Таким же образом осуществляется и перенаправление на другой Nginx.

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

server {
    listen 80;
    server_name 192.168.1.15;
    return 301 http://site.ru$request_uri;
    }

Перенаправление домена без www на домен с www

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

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

server { 
     ...
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri;
}

Перенаправление одного URL

location /old-adres-url.htm {
rewrite ^(.*)$ http://new-domain.com/new-adres-url.htm redirect;
}

Перенаправление на index.php

Сделать так, чтобы запросы из браузера обрабатывались через index.php можно таким образом:

location /public/ {
    index index.php;
    try_files $uri $uri/ /public/index.php?$args;
}

Если же файл расположен в корневом каталоге, перенаправление на index.php указывается командой:

location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;

Перенаправление «после слэша» (/)

Следующий блок позволяет установить перенаправление «после слэша» для домена:

location /mail {
return 301 https://mail-server.com/mail-panel;
}

Это приведет к тому, что после ввода адреса http://domain.com/mail пользователь будет перенаправлен на https://mail-server.com/mail-panel.

Стоит добавить в приведенный пример знак «=», чтобы перенаправление относилось только к этому элементу (почта), а не ко всему, что начинается с «mail»:

location = /mail {
return 301 https://mail-server.com/mail-panel;
}

Перенаправление с изменением типа файла

Еще один вариант будет полезным, когда ссылку на файл HTML нужно автоматически заменить ссылкой на файл PHP:

location ~ (.*).html$ {
rewrite ^(.*)$ http://my-site.com$1.php redirect;
}

Несколько доменов, один каталог и один основной домен

Этот прием пригодится при наличии нескольких доменов. Для примера возьмем следующие домены:

  • new-address.ru
  • new-address.com
  • new-address.org

Все эти домены указывают на один и тот же каталог на сервере. Соответственно, они отображают одну и ту же страницу/контент, хотя и при вводе разных адресов.

Не стоит забывать об исключении ошибки 404 («страница не найдена»), которая может возникнуть, если кто-то воспользуется ссылкой на товар/страницу с одного из альтернативных доменов. Решить эту задачу можно следующим способом:

server {
server_name new-adress.ru new-adress.com new-adress.org;
rewrite ^ http://new-adress.ru$request_uri? permanent;
}

Таким образом, все альтернативные адреса, отличные от «.ru», будут направлены на «new-address.ru», который является основным адресом.

Перенаправление в зависимости от IP-адреса посетителя

Приведённый ниже способ предпочтителен с точки зрения SEO-оптимизации, так как при выполнении сценария в ссылках ничего не меняется:

set $WWWDIR "old-version";
if ($remote_addr ~ MY_IP) {
set $WWWDIR "new-version";
}
root /var/www/[domain]/$WWWDIR/;

При посещении сайта, сервер предоставляет владельца или администратору ресурса (MY_IP) файлы из каталога new-version («новая-версия»). Когда страница посещается «сторонним лицом», сервер открывает старую версию сайта.

Перенаправление в зависимости от IP-адреса посетителя и браузера

Ситуация становится немного сложнее, когда нужно нужно организовать подключение с использованием сразу двух условий:

  1. указанного IP;
  2. строго определённого браузера.

К сожалению, Nginx не поддерживает правила объединения, поэтому здесь следует применить небольшой трюк:

set $WWWDIR "old-version";
if ($remote_addr ~ MY_IP) {
set $test okA;
}
if ($http_user_agent ~ Firefox) {
set $test "${TEST}okB";
}
if ($test = okAokB) {
set $WWWDIR "public_html";
}
root /var/www/[domain]/$WWWDIR/;

Здесь используется дополнительная переменная $TEST. С первым условием (действительным IP-адресом) она получает значение «okA», а со вторым (браузер Firefox) — дополнительное значение «okB».

В результате, значением должно быть «okAokB». И только когда оба условия выполняются одновременно ($ TEST соответствует «okAokB»), открывается доступ в соответствующий (рабочий) каталог (public_html).

В то время как на рабочем месте часто используется статический IP-адрес, бывает, что работу над сайтом нужно проводить удалённо, с другого IP-адреса.

Хотя в таких ситуациях может помочь подключение через VPN, это не всегда возможно. Здесь применяется еще одно условие — проверка cookie:

server {
[...]
set $WWWDIR "old-version";
if ($cookie_name-site = "test") {
set $WWWDIR "public_html";
}
root /var/www/[domain]/$WWWDIR/;
[...]
}

Если в браузере будет сохранен cookie с контентом «text», то файлы нового сайта будут открываться без редиректа.

Очевидно, понадобится механизм для сохранения соответствующего куки в браузере. Здесь достаточно применить директиву PHP:

<?php
$cookie_name = "name-site";
$cookie_value = "test";
setcookie( $cookie_name, $cookie_value, time() + 300, '/' ); // 300 = 300 sekond = 5 minutes
echo "Generated cookies";
?>

Она сохраняется на сервере (например, в файле cookie.php). Он добавляется в каталог со старой (для создания cookie) и новой страницей (обновления cookie до его истечения). Данный код выполняет следующую инструкцию:

  1.     Осуществляется переход по адресу [domain] /cookie.php.
  2.     Выполняется стандартный переход на сайт.
  3.     Вместо старого сайта открывается новый.

В приведенном выше примере cookie действителен в течение 5 минут (300 секунд), после чего — если он не будет создан снова — вместо новой страницы снова будет отображаться старая страница. Когда новая страница готова, достаточно удалить эти несколько строк.

Источник
Оцените статью
Разработчик на bitrix и wordpress