nginx rewrite füge einen Parameter am Ende einer URL an

13

Ich muss meinen Reverse-Proxy so konfigurieren, dass der folgende Parameter am Ende der URL hinzugefügt wird: &locale=de-de

Das funktioniert fast:

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

Das Problem ist jedoch, dass ich "& locale = de-de" nur anhängen muss, wenn es nicht bereits vorhanden ist und wenn ein "?" in der url ...

Kann ich Hilfe bei der Formulierung des richtigen regulären Ausdrucks erhalten, um dies zu tun?

Eine andere Frage: Warum wird das Fragezeichen in meiner URL nicht angezeigt, wenn ich
Folgendes verwende: $ uri? $ Args

Oder $ uri $ is_args $ args übersetzt die nicht codierte URL und das Fragezeichen wird als% 3f angezeigt.

Ideen?

BEARBEITEN: Es scheint, dass dieses Verhalten bei der Verwendung in Kombination mit proxy_pass vorhanden ist. Bei einem einfachen Umschreiben funktioniert es wirklich gut.

Sascha
quelle

Antworten:

15
  1. In rewriteÜbereinstimmung nur mit dem URL- Pfadteil . Das heißt, $1wird nicht die Abfragezeichenfolge enthalten.
  2. Standardmäßig hängt Nginx die ursprüngliche Abfragezeichenfolge an den Neuschreibersatz an.

So sollte es sicher sein zu schreiben

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

Wenn Sie nicht möchten, dass Nginx die ursprüngliche Abfragezeichenfolge anfügt, geben Sie einfach ?am Ende der Ersatz-URL Folgendes an:

rewrite ^(.*)$ $1?locale=de-de? break;
Alexander Azarov
quelle
Vielen Dank! Ich habe nicht gesehen, dass ich versucht habe, es falsch zu machen.
Sascha
A + das ist die beste Antwort
Vielen Dank
3

Die Übereinstimmung für rewriteenthält nicht die Abfrageparameter, daher müssen Sie sie an anderer Stelle testen.

Versuchen:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Shane Madden
quelle
1
"IfIsEvil": wiki.nginx.org/IfIsEvil
Alexander Azarov
@ Alexander Guter Punkt; das rewritemuss ein lastsein, wenn sicher. Bearbeitet
Shane Madden
3

Der rewriteändert nicht die Anforderungsparameter, sondern nur den Pfad des URI. Meiner Erfahrung nach führt das Durcheinander mit den Neuschreibungen zu merkwürdigen Zyklen, in denen der neue Parameter ad infinitum angehängt wird. Rewrite ist in Nginx wahrscheinlich nicht der richtige Weg.

Stattdessen sollten Sie die $argsVariable mithilfe der setDirektive ändern :

set $args $args&locale=de-de;
Palimondo
quelle
Ich bin nicht einverstanden, $argsdass mutiert werden sollte. Siehe stattdessen @ AlexanderAzarovs Lösung.
Vielen Dank,