réécriture nginx ajouter un paramètre à la fin d'une URL

13

J'ai besoin de configurer mon proxy inverse pour que le paramètre suivant soit ajouté à la fin de l'URL: &locale=de-de

Cela fonctionne presque:

rewrite ^(.*)$ $1&locale=de-de break;

Cependant, le problème est que je n'ai besoin d'ajouter '& locale = de-de' que s'il n'est pas déjà là et s'il y a un '?' dans l'url ...

Puis-je obtenir de l'aide sur la formulation de l'expression rationnelle correcte pour ce faire?

Une autre question: pourquoi le point d'interrogation dans mon URL ne s'affiche-t-il pas si j'utilise ceci:
$ uri? $ Args

Ou $ uri $ is_args $ args traduit l'url non encodée et le point d'interrogation est affiché comme% 3f.

Des idées?

EDIT: Il semble que ce comportement existe lors de l'utilisation en combinaison avec proxy_pass. Dans une simple réécriture, cela fonctionne très bien.

Sascha
la source

Réponses:

15
  1. Dans rewritevous ne correspondez qu'à la partie du chemin de l'URL . Ce qui signifie, $1ne contiendra pas la chaîne de requête.
  2. Par défaut, Nginx ajoute la chaîne de requête d'origine au remplacement de réécriture.

Donc, il devrait être sûr d'écrire

rewrite ^(.*)$ $1?locale=de-de break;

Dans le cas où vous ne souhaitez pas que Nginx ajoute la chaîne de requête d'origine, spécifiez simplement ?à la fin de l'URL de remplacement:

rewrite ^(.*)$ $1?locale=de-de? break;
Alexander Azarov
la source
Je vous remercie! Je n'ai pas vu que j'essayais de le faire de la mauvaise façon.
Sascha
A + c'est la meilleure réponse
Merci
3

La correspondance pour rewriten'inclut pas les paramètres de requête, vous devez donc tester cela ailleurs.

Essayer:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Shane Madden
la source
1
"IfIsEvil": wiki.nginx.org/IfIsEvil
Alexander Azarov
@Alexander Bon point; qui a rewritebesoin lastd'être sûr. Édité.
Shane Madden
3

Le rewritene modifie pas les paramètres de la demande, uniquement la partie chemin de l'URI. D'après mon expérience, jouer avec les réécritures conduit à des cycles étranges, où le nouveau paramètre est ajouté à l'infini. La réécriture n'est probablement pas la façon de procéder dans Nginx.

Au lieu de cela, vous devez modifier la $argsvariable à l'aide de la setdirective:

set $args $args&locale=de-de;
Palimondo
la source
Je suis en désaccord que cela $argsdevrait être muté. Voir plutôt la solution de @ AlexanderAzarov.
Merci