Redirección de Nginx basada en palabras clave en los argumentos

Redirección de Nginx basada en palabras clave en los argumentos

Soy muy nuevo en nginx (aproximadamente 1 día) y lo estamos usando como proxy inverso para algunas aplicaciones. Agregaremos otra aplicación que procesará un pequeño subconjunto de solicitudes existentes. Estoy tratando de interceptar las URL que llegan a la API bacalao/artículos y contienen item.id en los argumentos, y luego enviar estas solicitudes y sus argumentos a esta nueva aplicación que he descartado por ahora porque no está lista.

Me gustaría dejar todas las demás solicitudes en paz, es decir, la API no es "/cod/acticles", la solicitud no contiene item.id en los argumentos.

URL de ejemplo que debe enviarse a la nueva aplicación.

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

URL de ejemplo que no deben enviarse.

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....

Nota: .... sólo significa que hay otros argumentos

A continuación se muestra mi configuración actual en Nginx. Parece hacer la "intercepción", pero hay un par de cosas que me parecen mal.

En primer lugar, creo que usar "si" no es ideal y podría haber mejores formas de hacerlo. Pero no he logrado hacer coincidir la sección de argumentos.

En segundo lugar, los registros de acceso de nginx muestran 3 solicitudes de una URL coincidente. x2 301 respuestas, y 1 200 respuesta. ¿Se espera esto? Si es así, ¿hay una mejor manera de hacer esto para que solo haya 1 solicitud, ya que parece que he creado una carga adicional para nginx?

#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;
}

Respuesta1

Lo solucioné con el siguiente código.

   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;
}

información relacionada