Как сделать редирект nginx

Обновлено: 04.07.2024

Довольно важный момент при настройке сайта. Неправильно настроенный редирект может сильно повредить поисковой выдачи сайта. Самые распространённые ситуации, в которых приходиться использование Permanent Redirect 301:

Важно: если страница перемещена временно используйте 302 Moved Temporarily. Склейки страниц в этом случае не произойдет и страницу с редиректом можно будет всегда восстановить.

Permanent Redirect 301 для apache (.htaccess)

Вставлять правила нужно сразу после строк:

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

Автоматизация управляющей компании

Автоматизация управляющей компании

Nginx, 301 редирект с www на без www

Nginx, 301 редирект с без www на с www

Nginx, 301 редирект для одной страницы

Nginx, 301 редирект для папки

Nginx, 301 редирект с одного домена на другой

Если вы сменили домен сайт и хотите перенести вес старого домена на новый, то можно сделать 301-й редирект со старого домена на новый:

Nginx, 301 редирект с каждой страницы одного домена на такой же URL адрес другого домена Если вы планируете изменить свой домен или изменить название предприятия, то перенаправление домена является единственным лучшим решением для сохранения пользователей и перевода их запросов на новый домен.

Nginx, 301 редирект со страниц со слешем на страницы без слеша в конце URL

Часто бывает так что одна и та же страница доступна по двум URL, например /may-best-page и /my-best-page/, если человеку понятно что это одна и та же страница, то поисковые системы понимают это как две разные страницы, соответственно разбивают вес страницы, а также показываются в аналитике (статистике) как 2 разные страницы. Для того, что бы избежать этого вы можете сделать 301 редирект со страниц со слешем в конце URL на без него:

В этой статье мы поговорим о том, как в nginx нынче модно делать редиректы. Точнее, цель даже не в том, чтобы научить делать редиректы (это всё мелочи), а в том, чтобы вы после прочтения статьи точно поняли, что вы написали только что в конфиге (и зачем).
Для начала нужно узнать, как nginx выбирает нужный server<> для обработки запроса. Первым делом, разберемся с важным моментом в районе listen. Дело в том, что в nginx можно написать по-разному:

Так вот. Очень важно знать, что если вы где-то в конфиге написали listen ip:80, то для этой связки IP+порта ни один server<> с listen 80 уже работать не будет (ну только если написать 2 параметра listen =)).
Переводя для таких же тупых, как я. Если у вас на сервере много хостов и все они с listen 80, то не вздумайте писать хоть в одном конфиге listen ip:80. Nginx начнет отвечать на все запросы к этому ip на 80м порту одним вхостом. То есть на все запросы станет показывать один и тот же сайт. Я так продакшн большой ломал, ага
Так вот. Имея на руках ip и порт, nginx выбирает все server<> с максимально совпадающим listen. Дальше по server_name начинает выбирать конкретный server<> из списка. server_name может быть записан в трех видах:


Да, если вам нужно сделать rewrite, исходя из наличия аргумента — то без if-а не обойтись. В остальных случаях лучше пользоваться приёмом из первых примеров — отделяем запрос в отдельный location внутри конкретного server<> и внутри него делаем return.
Ах да, лучше писать location / с редиректом внутри, даже если другой конфигурации в этом server<> сейчас не будет. Если потом вы решите дописать что-то, а return прописан у вас прямо в server<> — то потом можно поседеть.

Директивы break, if, return, rewrite и set обрабатываются в следующем порядке:

  • последовательно выполняются директивы этого модуля, описанные на уровне server;
  • в цикле:
    • ищется location по URI запроса;
    • последовательно выполняются директивы этого модуля, описанные в найденном location;
    • цикл повторяется, если URI запроса изменялся, но не более 10 раз.

    Директивы

    Синтаксис: break;
    Умолчание:
    Контекст: server , location , if

    Если директива указана внутри location, дальнейшая обработка запроса продолжается в этом location.

    Синтаксис: if ( условие ) < . >
    Умолчание:
    Контекст: server , location

    Проверяется указанное условие . Если оно истинно, то выполняются указанные в фигурных скобках директивы этого модуля и запросу назначается конфигурация, указанная внутри директивы if . Конфигурации внутри директив if наследуются с предыдущего уровня конфигурации.

    В качестве условия могут быть заданы:

      имя переменной; ложными значениями переменной являются пустая строка или “ 0 ”;

    Синтаксис: return код [ текст ];
    return код URL ;
    return URL ;
    Умолчание:
    Контекст: server , location , if

    Завершает обработку и возвращает клиенту указанный код . Нестандартный код 444 закрывает соединение без передачи заголовка ответа.

    Начиная с версии 0.8.42 можно задать либо URL перенаправления (для кодов 301, 302, 303, 307 и 308) либо текст тела ответа (для остальных кодов). В тексте тела ответа и URL перенаправления можно использовать переменные. Как частный случай, URL перенаправления может быть задан как URI, локальный для данного сервера, при этом полный URL перенаправления формируется согласно схеме запроса ( $scheme ) и директивам server_name_in_redirect и port_in_redirect.

    До версии 0.7.51 можно было возвращать только следующие коды: 204, 400, 402 — 406, 408, 410, 411, 413, 416 и 500 — 504.

    См. также директиву error_page.

    Синтаксис: rewrite regex замена [ флаг ];
    Умолчание:
    Контекст: server , location , if

    Необязательный параметр флаг может быть одним из:

    Полный URL перенаправлений формируется согласно схеме запроса ( $scheme ) и директив server_name_in_redirect и port_in_redirect.

    Если же эти директивы поместить в location “ /download/ ”, то нужно заменить флаг last на break , иначе nginx сделает 10 циклов и вернёт ошибку 500:

    Если в строке замены указаны новые аргументы запроса, то предыдущие аргументы запроса добавляются после них. Если такое поведение нежелательно, можно отказаться от этого добавления, указав в конце строки замены знак вопроса, например:

    Если в регулярном выражении встречаются символы “ > ” или “ ; ”, то всё выражение следует заключить в одинарные или двойные кавычки.

    Синтаксис: set $переменная значение ;
    Умолчание:
    Контекст: server , location , if

    Устанавливает значение указанной переменной. В качестве значения можно использовать текст, переменные и их комбинации.

    Определяет, нужно ли писать в лог предупреждения о неинициализированных переменных.

    Внутреннее устройство

    будут транслированы в такие инструкции:

    можно сделать на одну инструкцию меньше, если в регулярном выражении перенести первый слэш внутрь скобок:

    Читайте также: