ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

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

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];

 

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

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

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

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

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

 

Например:

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

В то время как правила перезаписи 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, как здесь:

Как и в предыдущем примере, мы используем $ 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»:

Так как мы не хотим описанное выше поведение, мы использовали «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;

 

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

После указанного изменения, вы начали видеть такие строки, которые ясно показывают, какие конкретные правила переписываются в переводе входящего 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"

 

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

Exit mobile version