Поиск по сайту:
Нельзя научиться программированию с помощью ручного калькулятора, но можно забыть арифметику. (Алан.Дж.Перлис)

7 правил rewrite в Nginx с примерами Reg-Ex и Flags

12.08.2017
7 правил Rewrite в Nginx с примерами Reg-Ex и Flags

Возможность изменения (Rewrite) во входящем URL в другой URL на основе ваших критериев является существенным признаком для любого веб-сервера.

Nginx Rewrite является очень мощным и гибким.

В этой статье мы объясним следующие примеры на основе Nginx Rewrite:

  1. Пример использования Nginx Rewrite $ 1, $ 2, ..
  2. Создание файла контроллера с помощью Nginx Rewrite
  3. Rewrite Break Flag в локальном контексте
  4. Добавление вопросительного знака при замене строки в Nginx Rewrite
  5. If и Директива Rewrite
  6. Примеры Nginx Rewrite Flags
  7. Захват доступа Nginx Rewrite в Error Log File


Ниже приведен синтаксис Nginx Rewrite:

rewrite reg-ex replacement [flag];

 

В приведенном выше:

  • Директива Rewrite является частью модуля ngx_http_rewrite_module.
  • reg-ех — Это регулярное выражение PCRE, которое вы будете здесь указать. Она будет использоваться для сопоставления входящего запроса URI.
  • replacement — Если reqeust URI совпадает с REG-ех, то Nginx будет использовать эту строку замены для изменения запроса URI
  • flag — будет решать, требуется ли дальнейший процесс директив Rewrite или нет. Это объясняется подробно в одном из приведенных ниже примеров.

В Nginx, директива Rewrite может быть указана в одном из следующих трех контекстов: server, location, if

1. Пример использования Nginx Rewrite $ 1, $ 2, ..

Ниже приведен пример директивы Nginx Rewrite:

rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html last;

 

Например:

  • url/data/distro/andreyex/test.php перепишет в виде url/data/distro/linux/test.html
  • В этом примере, когда вы вызываете оригинальный URL с test.php из браузера, он будет переписан на основе вышеприведенного правила перезаписи и будет указывать страницу test.html из /data/distro/linux/

В приведенном выше правила перезаписи:

  • $ 1 и $ 2 будет фиксировать соответствующие строки из исходного URL, которые не изменяется
  • $ 1 в замещающей строке заместит находится внутри 1-й скобки () в reg-ехе. В нашем примере, $1 в /data/
  • Точно так же $ 2 заместит находится внутри 2 скобки () в reg-ехе. Таким образом, $ 2 в (\w+), так что любое слово, которое приходит после /andreyex/ в оригинальном URL. В нашем примере, $ 2 является test
  • last — этот флаг убедиться, чтобы остановить поиск директивы Rewrite в текущем местоположении или блоке и использовать измененный URI (т.е. переписан URI) и искать новое место для любых дальнейших директив Rewrite.
  • *$ — Указывает на расширение в исходном URL. Обратите внимание, что здесь, расширение от исходного URL будет заменено на .html в URL путем Rewrite. Таким образом, даже если вы вызываете .php в оригинальном URL, он будет показывать только файл .html в переписанной URL.

В то время как правила перезаписи Nginx делают подобные вещи, как Apache, есть еще много различий в плане того, как вы пишете правило перезаписи в Nginx.

2. Создание файла контроллера с помощью Nginx Rewrite

Используя Rewrite, вы можете трассировать много поступающих оригинальных URL в шаблон мастера контроллера, который будет обслуживать эти запросы.

Следующий пример Rewrite объясняет это.

rewrite ^/linux/(.*)$ /linux.php?distro=$1 last;

 

В приведенном выше примере, когда вы делаете запрос к URL andreyex.ru/linux/centos, он получит переписанный с использованием вышеуказанного правила, и он выдаст страницу с этим переписанным URL: andreyex.ru/linux.php?distro=centos

Как вы видите выше, любой URL, который имеет соответствующий шаблон здесь (т.е. /linux/ в URL) будет выполнять linux.php, но последняя часть в исходном входящем URL будет использоваться в качестве значения для аргумента distro контроллера linux.php.

Таким образом, приведенное выше правило перезаписи преобразует входящий URL, как здесь:

  • linux/centos becomes linux.php?distro=centos
  • linux/debian becomes linux.php?distro=debian
  • linux/redhat becomes linux.php?distro=redhat
  • и т.д.

Как и в предыдущем примере, мы используем $ 1 в замещающей строке, чтобы захватить все, что находится внутри 1-й скобках () в reg-ех. В этом случае, последняя часть оригинального входящего URL.

Мы также используем здесь флаг last, чтобы проинструктировать Nginx, остановить поиск дальнейших директив Rewrite в текущем-блоке и о переходе к следующему месту соответствия для дальнейшего поиска.

3. Rewrite Break Flag в локальном контексте

В этом примере, мы поместили условие перезаписи внутри директивы location.

В этом примере директива location /data/, также совпадает с $ 1 в строке замены, приведенной ниже.

location /data/ {
 rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html break;
 return 403;
}

 

Это то, что случилось бы, если бы вы использовали флаг «last»:

  • Так что, если у вас был флаг «last», после первоначальной перезаписи URL, Nginx как правило, ищет следующую директиву rewrite для нового URL.
  • В этом случае, Nginx будет держать перенаправление на одни и те же данные о местоположении и продолжать обработку тех же правил перезаписи максимум 10 раз, и, потом, он возвратит код 500 ошибок.

Так как мы не хотим описанное выше поведение, мы использовали «break» в качестве флага, который просто остановит обработку перезаписи блоков.

4. Добавление вопросительного знака при замене строки в Nginx Rewrite

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

В следующем примере, в строке замены, нет знака вопроса в конце. т.е. нет вопросительного знака после $ 1

rewrite ^/linux/(.*)$ /linux.php?distro=$1 last;

 

В приведенном выше примере, когда замена строки включает входящие аргументы запроса, то аргументы из предыдущего запроса добавляется после них.

Несколько раз, вы, вероятно, не хотите, чтобы добавление произошло. Что в этом случае рекомендуется использовать? Показано ниже.

Что в следующем примере в строке замещения Rewrite Nginx, мы добавили? в конце. Существует вопросительный знак после $ 1

rewrite ^/linux/(.*)$ /linux.php?distro=$1? last;

 

В приведенном выше примере, строка замены включают входящие аргументы запроса, поэтому аргументы из предыдущего запроса не добавляется после них.

5. If и Директива Rewrite

Следующие несколько примеров показывают, что мы можем использовать Rewrite внутри директивы if.

Вы можете сделать условное переписывание на основе if, если условие сравнения с использованием переменных, таких как $scheme, $http_host, $http_user_agent, и т.д., как показано ниже:

if ($scheme = "http") {
  rewrite ^ http://www.andreyex.ru$uri permanent;
}

if ($http_host = andreyex.ru) {
  rewrite  (.*)  http://www.andreyex.ru$1;
}

if ($http_user_agent = MSIE) {
    rewrite ^(.*)$ /pdf/$1 break;
}

 

Обратите внимание, что есть лучшие способы для достижения конечного результата приведенных выше примеров. Приведенные выше примеры просто даны для того, чтобы показать, что мы можем добавить директиву rewrite внутри, если заявление в файле конфигурации Nginx.

Обратите внимание, что вы можете также установить значение двух следующих параметров или выключить в файле конфигурации Nginx:

server_name_in_redirect on 
port_in_redirect off

6. Примеры флагов в Nginx Rewrite

Ниже приведены 4 различных директив flags в Nginx Rewrite, которые вы можете использовать.

last: Этот флаг остановит обработку директив перезаписи в текущем наборе, и начнет на новом месте , которое соответствует измененной URL.

rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html last;

 

break: Этот флаг остановит обработку директив перезаписи в текущем наборе.

rewrite ^(/data/.*)/andreyex/(\w+)\.?.*$ $1/linux/$2.html break;

 

redirect: Этот флаг будет делать временную переадресацию с использованием 302 HTTP — кода. Это в основном используется , когда строка замены не HTTP или HTTPS, или $ схема

permanent: Этот флаг будет делать постоянную переадресацию с помощью HTTP 301 кода

rewrite ^ http://www.andreyex.ru$uri permanent;

7. Захват доступа Nginx Rewrite в Error Log File

По умолчанию, в любое время, при успешной перезапись в Nginx, он не регистрирует его в error.log.

Первоначально, когда вы пишете сложные правила перезаписи, вы действительно хотите убедиться, что Nginx будет делать rewrite согласно вашему требованию.

Для этого необходимо включить журнал перезаписи, который будет добавлять в журнал запись Nginx, что делает успешную перезапись, используя любые из директив перезаписи в файле конфигурации.

Для этого используйте директиву rewrite_log.

Добавьте следующие две строки в Nginx default.conf:

error_log /var/log/nginx/error.log notice;
rewrite_log on;

 

В приведенном выше:

  • Первая строка указывает местоположение файла error_log, где мы хотим, чтобы записывались сообщения о перезаписи. Обратите внимание, что сообщение перезаписи, типа уведомления. Таким образом, вы должны добавить «note» в конце этой линии, как показано выше.
  • rewrite_log on — Эта линия включает ведение журнала всех директив модуля ngx_http_rewrite_module в файл error_log.

После указанного изменения, вы начали видеть такие строки, которые ясно показывают, какие конкретные правила переписываются в переводе входящего URL. Это также покажет окончательный перевод URL в записи журнала.

[notice] 12345#12345: *1 "^(/data/.*)/andreyex/(\w+)\.?.*$" matches "/data/distro/andreyex/test", client: 192.168.101.1, server: localhost, request: "GET /data/distro/andreyex/test HTTP/1.1", host: "213.159.209.228"
[notice] 12345#12345: *1 rewritten data: "/data/distro/linux/test.html", args: "", client: 192.168.101.1, server: localhost, request: "GET /data/distro/andreyex/test HTTP/1.1", host: "213.159.209.228"

 

В приведенном выше строк лога:

  • Первая линия показывает две вещи 1) Входящий URL 2) используемые правила перезаписи
  • В 1-й линии, показывается входящий URL (т.е. запрос). В этом примере запрос: «GET /data/distro/andreyex/test»
  • В 1-й линии, он также показывает правила перезаписи Nginx, которому соответствовал этот входящий запрос. В этом примере правило перезаписи используемой Nginx является: “^(/data/.*)/andreyex/(\w+)\.?.*$”
  • Во 2-й линии, показывает переписанный переведенный URL, который использовался в Nginx после применения правила перезаписи. В этом примере, переведенный URL переписан: /data/distro/linux/test.html

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 3,50 из 5)
Загрузка...
Поделиться в соц. сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

5 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Автор

«Создание сайтов», блин.
Поправь анимацию, стыд же 🙂
http://recordit.co/RFdyOuzyII

И вот ещё — что за безымянные поля в форме отправки комментариев?
https://yadi.sk/i/xbT4CoGH3Q8Ry9

Іван Кравчук

Спасибо за подробное описание — помогло разобраться )

Oregi

Искал интересующий вопрос. И только у тебя нашел как его сделать. Итог быстро написанный код. У остальных ресурсов долбанный копипаст. Автору от души, так сказать..

Игорь

А как например передать полученную переделанную ссылку в переменную для дальнейшей передачи в скрипт?

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

Спасибо!

Теперь редакторы в курсе.