Назад | Перейти на главную страницу

Путь преобразования правила перенаправления NGINX в строку запроса

У нас есть одно существующее приложение IIS, работающее с Helicon APE для перезаписи URL-адресов с использованием существующих правил Apache. Это один из примеров:

RewriteRule ^/webapp/([^/]*)/([^/]*)(/.+)? /webapp/$4?$2=$3 [NC,L,P,QSA]

Для этих правил исходный URL-адрес, например /webapp/f6/3/gx/1/default.htm превращается в /default.htm?f6=3&gx=1. Это поддерживает переменное количество промежуточных путей в APE (по-видимому, и в Apache).

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

Однако я обнаружил одну проблему: одно и то же правило для перезаписи nginx не работает одинаково; Мне пришлось преобразовать его, чтобы он соответствовал:

rewrite ^/webapp/(.*)/([^/]+).htm /webapp/$2?$1;

что, собственно, для /webapp/f6/3/gx/1/default.htm возвращается /webapp/default.htm?f6/3/gx/1.

Я пытался найти способ заставить nginx преобразовывать элементы пути /x/y/g/z в пары строк запроса ?x=y&g=z. Кажется, что Apache делает это автоматически, тогда как nginx этого не делает и не может ничего найти в документации или в других вопросах на этом сайте или в StackOverflow.

Очевидно, с помощью карты это можно было бы сделать, но я не могу найти конкретного использования, и я не эксперт по nginx, чтобы это сделать. Любая помощь или указание. будут рады.

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

Например:

rewrite ^(/webapp)/([^/]+)/([^/]+)(/.+)$ $1$4?$2=$3 redirect;

Так как rewrite автоматически добавляет существующую строку запроса, приведенный выше оператор расширяет ее с каждым перенаправлением.

Того же трюка можно добиться с помощью внутреннего перенаправления, поместив rewrite...last заявление в location блок.

Видеть этот документ для большего.