У нас есть одно существующее приложение 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 /(.*)/([^/ sizes+). 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
в строку блок расположения
.
Подробнее см. этот документ .