Redirecionamento Nginx baseado em palavras-chave em argumentos

Redirecionamento Nginx baseado em palavras-chave em argumentos

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

informação relacionada