Редиректы на Nginx: Rewrite vs Return
Dec 7, 2017 10:39 · 333 words · 2 minute read
Довольно часто при обращении к сайту используются редиректы на уровне вебсервера Nginx. Чаще всего редиректы применяют для изменения имени домена (без www на домен с www) или протокола (с HTTP на HTTPS).
Настройку на редиректов в NGINX можно сделать двумя способами — давайте разберемся!
Пример настройки редиректа с домена без www на домен с www:
server {
server_name example.com;
# Вариант 1
return 301 $scheme://www.$host$request_uri;
# Вариант 2
rewrite ^ http://www.$host$request_uri? permanent;
}
Пример редиректа с HTTP на HTTPS:
server {
server_name example.com;
# Вариант 1
return 301 https://$server_name$request_uri;
# Вариант 2
rewrite ^ https://$server_name$request_uri? permanent;
}
Рассмотрим подробнее вариант с использованием директивы rewrite
:
rewrite ^ http://$host$request_uri? <флаг>;
Здесь:
$host
— имя хоста из запроса, если отсутствует — имя в поле «Host» заголовка, если тоже отсутствует — имя сервера;$request_uri
— первоначальный запрос с аргументами (все, что идет после доменного имени).
Флаги могут принимать следующие значения:
permanent
— редирект с кодом 301.redirect
— редирект с кодом 302.last
— закончить обработку с переходом в новыйlocation
.break
— закончить обработку и остаться в текущемlocation
.
В вариант с использованием директивы return
:
return <код> https://$host$request_uri;
коды могут использоваться любые, но чаще всего — 301, 302, 404.
Для обычного посетителя сайта разницы между кодами 301 и 302 нет. А вот для поискового робота разница огромная — 301-й редирект говорит о «склеивании» страниц. Это означает для поисковика то, что старая и новая страницы — это одно и тоже. Таким образом результаты ранжирования необходимо сохранить для новой страницы. 302-й редирект просто говорит о том, что нужно перейти по другому адресу. Поисковый робот не сохраняет результат выдачи для новой страницы, индексируя его с нуля.
Ключевые особенности обоих вариантов:
REWRITE
- переписывается только та часть исходного URL, которая соответствует регулярному выражению;
- медленнее, чем
return
; - возвращает HTTP 302 (Moved Temporarily) во всех случаях, кроме явно указанного флага permanent;
- лучше подходит для временного изменения URL.
RETURN
- весь URL-адрес переписывается на указанный URL-адрес;
- быстрее, чем
rewrite
; - возвращает HTTP 301 (Moved Permanently);
- лучше подходит для постоянного изменения URL-адреса;
- не нужно устанавливать флаг
permanent
.