В этом руководстве мы рассмотрим 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-адреса и строка считается окончательной.