Перенаправление Nginx на основе ключевого слова в аргументах

Перенаправление Nginx на основе ключевого слова в аргументах

Я совсем новичок в nginx (1 день или около того), и мы используем его как обратный прокси для нескольких приложений. Мы собираемся добавить еще одно приложение, которое будет обрабатывать небольшое подмножество существующих запросов. Я пытаюсь перехватывать URL-адреса, которые попадают в API cod/articles и содержат item.id в аргументах, а затем отправлять эти запросы и их аргументы в это новое приложение, которое я пока заглушил, так как оно не готово.

Я бы хотел оставить все остальные запросы в покое, т.е. API не "/cod/acticles", запрос не содержит item.id в аргументах.

Пример URL-адреса, который следует отправить новому приложению.

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

Примеры URL-адресов, которые не следует отправлять.

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

Примечание: .... просто означает, что есть и другие аргументы

Ниже приведен мой текущий конфиг в Nginx. Кажется, он делает "перехват", но есть пара вещей, которые кажутся мне неправильными.

Во-первых, я считаю, что использование "if" не идеально, и, возможно, есть лучшие способы сделать это. Но мне не удалось сопоставить раздел аргументов.

Во-вторых, журналы доступа nginx показывают 3 запроса на соответствующий URL. x2 ответа 301 и 1 ответ 200. Ожидается ли это? Если да, то есть ли лучший способ сделать это, чтобы был только 1 запрос, так как, похоже, я создал дополнительную нагрузку для 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;
}

решение1

Решил это с помощью следующего кода

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

Связанный контент