
У нас есть одно существующее приложение 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.
Видимо, с помощью map это можно сделать, но не могу найти конкретного использования, и я не эксперт по nginx, чтобы сделать это. Любая помощь или указание. будут приветствоваться.
решение1
Если вы правильно построите правило перезаписи, оно станет рекурсивным и будет запрашивать параметры на каждой итерации, пока не будут использованы все элементы пути.
Например:
rewrite ^(/webapp)/([^/]+)/([^/]+)(/.+)$ $1$4?$2=$3 redirect;
Поскольку rewrite
указанный выше оператор автоматически добавляет существующую строку запроса, он расширяет ее при каждом перенаправлении.
Того же трюка можно добиться с помощью внутреннего перенаправления, поместив rewrite...last
оператор в location
блок.
Видетьэтот документдля большего.