Ich habe einen Nginx Reverse-Proxy, der die Query-Zeichenfolge übergeben muss, die er empfängt. Diese Abfragezeichenfolge ist jedoch nicht gut formatiert und kann JSON enthalten, das nicht URL-codiert ist, d. H. Es enthält geschweifte Klammern, d. H. {}, Kommas, Doppelpunkte und doppelte Anführungszeichen! Leider habe ich keine Kontrolle darüber und dies verursacht den Downstream-Server zu blockieren, wenn die Zeichenfolge analysiert.nginx - URL-Encodierungsabfragezeichenfolge
Gibt es eine Möglichkeit, diese Zeichenfolge korrekt URL-Codierung vor dem Proxy-Vorgang?
Ich kann die geschweiften Klammern ersetzen, wie ich es weiß, wird nur eine Instanz jeder mit der config:
if ($args ~* '(.*){(.*)}(.*)') {
set $args $1%7B$2%7D$3;
rewrite (.*)$ $1;
}
proxy_pass http://127.0.0.1:8080;
aber ich weiß nicht im Voraus, wie viele Felder die JSON so hat es schwierig, die gleiche Logik wie oben für den Rest des Objekts zu verwenden.
Ich sollte auch erwähnen, dass ich nicht denke, dass dies mit Nginx URL-Decodierung Parameter verwandt ist, da ich nicht eine URI in der Proxy-Pass verwenden.
Danke!
UPDATE: Zur Zeit scheint das JSON-Objekt die gleichen Eigenschaften zu senden, also habe ich das als Workaround verwendet. Es ist ziemlich scheußlich und wird kaputt gehen, wenn sich die Anzahl der Eigenschaften ändert, aber die Arbeit für den Moment erledigt.
if ($args ~* '(.*){"(.*)":"(.*)","(.*)":"(.*)","(.*)":"(.*)","(.*)":"(.*)","(?<group10>.*)":"(?<group11>.*)"}(?<group12>.*)') {
set $args $1%7B%22$2%22%3A%22$3%22%2C%22$4%22%3A%22$5%22%2C%22$6%22%3A%22$7%22%2C%22$8%22%3A%22$9%22%2C%22${group10}%22%3A%22${group11}%22%7D${group12};
rewrite (.*)$ $1;
}
proxy_pass http://127.0.0.1:8080;
Beachten Sie, dass da dies mehr als 9 regex Gruppen gibt, ich Namen Gruppen 10 hatte, 11 und 12 ansonsten als 1 $ interpretiert bekommen + die Ziffer 0, 1 oder 2.
Gibt es eine robuster Weg dies zu tun?
Ich bin mir nicht sicher, ich verstehe, warum es ein Problem für Ihr Back-End ist, einen URI mit den geschweiften Klammern darin zu verarbeiten. Sind Sie sicher, dass das das eigentliche Problem ist? – cnst
Der Back-End-Server verwendet das Dropwizard-Framework (http://www.dropwizard.io/), das beim Analysieren der empfangenen Abfragezeichenfolge eine URISyntaxException auslöst. Ich bin nicht in der Lage, einen Weg zu finden, dies zu erfassen, da es außerhalb meiner Kontrolle zu passieren scheint. Die einfachste Problemumgehung, die ich mir vorstellen konnte, war, die Abfragezeichenfolge zu beheben, bevor sie den Webserver erreicht. – theChumpus