Я совсем новичок в 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;
}