Sou muito novo no nginx (cerca de 1 dia) e o estamos usando como proxy reverso para alguns aplicativos. Adicionaremos outro aplicativo que processará um pequeno subconjunto de solicitações existentes. Estou tentando interceptar URLs que atingem a API cod/articles e contêm item.id nos argumentos e, em seguida, enviar essas solicitações e seus argumentos para este novo aplicativo que eu esbocei por enquanto, pois não está pronto.
Eu gostaria de deixar todas as outras solicitações em paz, ou seja, a API não é "/cod/actles", a solicitação não contém item.id nos argumentos.
URL de exemplo que deve ser enviado para o novo aplicativo.
http://server/mdata/transfer/CUSTOMER/cod/articles?filter={"item.id":"ID00000000123"......}&limit=50&fields=[]&sort=.......
URLs de exemplo que não devem ser enviados.
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: .... significa apenas que há outros argumentos
Abaixo está minha configuração atual no Nginx. Parece fazer a "interceptação", mas há algumas coisas que me parecem erradas.
Em primeiro lugar, acredito que usar “if” não é o ideal e que pode haver maneiras melhores de fazer isso. Mas não consegui combinar a seção de argumentos.
Em segundo lugar, os logs de acesso do nginx mostram 3 solicitações de um URL correspondente. x2 301 respostas e 1 200 respostas. Isso é esperado? Nesse caso, existe uma maneira melhor de fazer isso para que haja apenas 1 solicitação, pois parece que criei uma carga adicional para o 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;
}
Responder1
Resolvi com o seguinte 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;
}