В этом руководстве мы рассмотрим 301 редирект для веб-серверов NGINX и Apache.

NGINX

Метод №1:

server {
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.

По завершении редактирования файлов остается проверить, правильны ли они:

nginx -t

Чтобы их применить, необходима перезагрузка Nginx:

systemctl restart nginx
Практическое использование редиректов
Редирект с 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

Установить перенаправление с HTTP на HTTPS (защищенный протокол SSL) можно следующим образом:

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

Здесь при всех обращениях domain.com по протоколу HTTP сработает перенаправление на 443-порт с использованием 301 редиректа для склейки доменов.

Чтобы установить редирект на HTTP с HTTPS, достаточно изменить код ответа сервера:

server {
listen 443;
server_name domain.com www.domain.com;
return 301 http://$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;
}
Перенаправление нескольких доменов в один каталог и один основной домен

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

example-domain.net
example-domain.com
example-domain.org

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

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

server {
server_name example-domain.net example-domain.com example-domain.org;
rewrite ^ http://example-domain.net$request_uri? permanent;
}

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

Apache

Все правила выполняются в прямом порядке их следования в файле .htaccess и правило, написанное позже, и будет выполняться позже.

.htaccess — это файл дополнительной конфигурации веб-сервера Apache, с помощью которого можно задавать настройки на уровне отдельных каталогов. В отличие от главного файла конфигурации httpd.conf, директивы в .htaccess распространяются только на тот каталог, где он размещен, и на дочерние каталоги.

Ниже приведены наиболее часто используемые правила настройки файла .htaccess для 301 редиректа. Все правила лучше размещать после двух строк:

Options +FollowSymLinks
RewriteEngine On
Перенаправление домена с WWW на домен без WWW
RewriteCond %{HTTP_HOST} ^http://www.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1[R=301,L]
Стандартное перенаправление с одной статической страницы на другую
Redirect 301 /was.php http://example.com/new.php
Настройка редиректа с HTTP на HTTPS (для всех страниц)
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
301-редирект с домена на домен
RewriteCond %{HTTP_HOST} ^old-site\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
Указание пути к файлу ошибки 404 с помощью .htaccess

Внимание, важно чтобы код ответа сервера для 404 ошибки был именно 404. Путь к файлу указывается с помощью следующей строчки:

ErrorDocument 404 /404-for-me.php
Памятка по используемым символам и обозначениям

Строчка RewriteCond — условие выполнения правила RewriteRule. Если условие выполняется, то срабатывает редирект. Правила могут задаваться с помощью регулярных выражений.

Спецсимволы, используемые в правилах и их значения.
  • ^ — спецсимвол начала строки;
  • $ — спецсимвол конца строки;
  • ! — спецсимвол отрицания;
  • . — точка, заменяет любой символ, но только один;
  • () — группировка;
  • \ — «экранирующий» слеш, следующий символ после него считается обычным, а не спецсимволом;
  • # — начало текстового комментария в файле.
Модификаторы используются после обычных, спецсимволов или их групп и позволяют расширить возможности шаблонов для срабатывания правил.
  • ? — символ повторяется 0 или 1 раз.
  • + — повторяется от 1 до 65536 раз.
  • * — повторяется от 0 до 65536 раз.
Флаги, задают доп. опции для используемого правила. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].
  • NC — флаг NoCase, отключающий проверку регистра символов при срабатывании правила.
  • R — флаг Redirect, производит процесс остановки изменения URL-адреса и возвращает результат. Чаще всего используется значение R=301, но возможны и другие для временных перенаправлений (302, MOVED TEMPORARY).
  • L — флаг Last, останавливает формирования URL-адреса и строка считается окончательной.