Редиректы на Nginx: Rewrite vs Return

Dec 7, 2017 10:39 · 333 words · 2 minute read nginx

Довольно часто при обращении к сайту используются редиректы на уровне вебсервера 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.
tweet Share