У нас есть одно существующее приложение 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
блок.
Видеть этот документ для большего.