2 votes

Règle de redirection NGINX transformant le chemin en chaîne de requête

Nous avons une application IIS existante qui fonctionnait avec Helicon APE pour réécrire les urls en utilisant les règles Apache existantes. Voici un exemple :

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

Pour ces règles, une url originale comme /webapp/f6/3/gx/1/default.htm se transforme en /default.htm?f6=3&gx=1 . Ceci supporte un nombre variable de chemins intermédiaires dans APE (apparemment dans Apache aussi).

Comme APE n'est pas très évolutif et se bloque sous la charge, j'ai commencé à mettre en place un NGINX qui se chargera des réécritures et de l'équilibrage des charges pour les serveurs IIS à l'arrière.

J'ai cependant constaté un problème : la même règle pour les réécritures nginx ne fonctionne pas de la même manière ; j'ai dû la transformer pour qu'elle corresponde :

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

qui, en fait, pour /webapp/f6/3/gx/1/default.htm renvoie à /webapp/default.htm?f6/3/gx/1 .

J'ai essayé de trouver un moyen de faire en sorte que nginx convertisse les éléments du chemin d'accès. /x/y/g/z en paires de chaînes de requête ?x=y&g=z . Apache semble le faire automatiquement, alors que nginx ne le fait pas, et je ne trouve rien dans la documentation ou dans d'autres questions sur ce site ou sur StackOverflow.

Apparemment, il est possible de le faire en utilisant map, mais je ne trouve pas d'utilisation spécifique et je ne suis pas un expert de nginx pour le faire. Toute aide ou indication sera la bienvenue.

2voto

HugoFS Points 313

Si vous construisez la règle de réécriture correctement, elle deviendra récursive et interrogera les paramètres à chaque itération jusqu'à ce que tous les éléments du chemin soient consommés.

Par exemple :

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

Comme rewrite ajoute automatiquement une chaîne de requête existante, l'instruction ci-dessus l'étend à chaque redirection.

La même astuce peut être réalisée avec une redirection interne en plaçant une balise rewrite...last à l'intérieur d'un location bloc.

Voir ce document pour plus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X