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

Правило перенаправления 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.

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

решение1

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

Например:

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

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

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

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

Связанный контент