Nginx-Umleitung basierend auf Schlüsselwort in Argumenten

Nginx-Umleitung basierend auf Schlüsselwort in Argumenten

Ich bin noch ganz neu bei nginx (seit etwa 1 Tag) und wir verwenden es als Reverse-Proxy für einige Anwendungen. Wir werden eine weitere App hinzufügen, die eine kleine Teilmenge der vorhandenen Anfragen verarbeitet. Ich versuche, URLs abzufangen, die auf die API cod/articles treffen und item.id in den Argumenten enthalten, und diese Anfragen und ihre Argumente dann an diese neue App zu senden, die ich vorerst als Stub erstellt habe, da sie noch nicht fertig ist.

Ich möchte alle anderen Anfragen unverändert lassen, d. h. die API ist nicht „/cod/acticles“, die Anfrage enthält nicht item.id in den Argumenten.

Beispiel-URL, die an die neue App gesendet werden soll.

http://server/mdata/transfer/CUSTOMER/cod/articles?filter={"item.id":"ID00000000123"......}&limit=50&fields=[]&sort=.......

Beispiel-URLs, die nicht gesendet werden sollen.

http://server/mdata/transfer/customer/cod/articles?filter{"lang":"en_US","article.id":"123456"}&limit=50....
http://server/mdata/transfer/customer/cod/items?filter{"lang":"en_US","article.id":"123456"}&limit=50....
http://server/mdata/transfer/customer/doc/articles?filter{"lang":"en_US","article.id":"123456"}&limit=50....

Hinweis: .... bedeutet nur, dass es andere Argumente gibt

Unten ist meine aktuelle Konfiguration in Nginx. Sie scheint das „Abfangen“ durchzuführen, aber es gibt ein paar Dinge, die mir falsch erscheinen.

Erstens glaube ich, dass die Verwendung von „if“ nicht ideal ist und dass es möglicherweise bessere Möglichkeiten gibt, dies zu tun. Aber ich konnte den Abschnitt mit den Argumenten nicht abgleichen.

Zweitens zeigen die Nginx-Zugriffsprotokolle 3 Anfragen für eine passende URL. 2 301-Antworten und 1 200-Antwort. Ist das zu erwarten? Wenn ja, gibt es eine bessere Möglichkeit, dies zu tun, sodass nur 1 Anfrage vorhanden ist, da es so aussieht, als hätte ich zusätzliche Last für Nginx erstellt.

#existing config for all /mdata/transfer/* APIs
location /mdata/transfer/ {
        add_header Access-Control-Allow-Origin *;
        allow all;
        proxy_pass        http://mds;
}

#static page which acts as a stub end point for testing.
location /proxyapp {
        root /opt/www;
}

#new config where I try to intercept /mdata/transfer/customer/cod/articles API with item.id contained in the arguments.
location ~ /mdata/transfer/customer/cod/articles {
        set $cst_proxy mds/mdata/transfer/customer/cod/articles;
        if ($args ~ "item.id") {
                set $cst_proxy localhost/proxyapp;
        }
        proxy_pass http://$cst_proxy$is_args$args;
        proxy_redirect off;
}

Antwort1

Habe es mit folgendem Code gelöst

   upstream proxy-app {
    server 127.0.0.1:4000;
}

upstream mds {
    server 127.0.0.1:1234;
}

location /mdata/transfer/CUSTOMER/cod/articles {
        add_header Access-Control-Allow-Origin *;
        set $cst_proxy mds;
        if ($args ~ "item.id") {
                set $cst_proxy proxy-app;
        }
        proxy_pass http://$cst_proxy;
}

verwandte Informationen