Redirecionamento Nginx com base na palavra-chave nos argumentos

2

Sou muito novo no nginx (1 dia ou mais) e estamos usando isso como um proxy reverso para alguns aplicativos. Vamos adicionar 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, enviem essas solicitações e seus argumentos para esse novo aplicativo, que eu apontei agora porque não está pronto.

Gostaria de deixar todas as outras solicitações sozinhas, ou seja, a API não é "/ cod / acticles", a solicitação não contém item.id nos argumentos.

Exemplo de URL que deve ser enviado para o novo aplicativo.

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

Exemplos de URLs 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 outros argumentos

Abaixo está minha configuração atual no Nginx. Parece fazer a "interceptação", mas há algumas coisas que parecem erradas para mim.

Em primeiro lugar, acredito que usar "se" não é ideal, e pode haver maneiras melhores de fazer isso. Mas eu não fui bem sucedido em combinar a seção de argumentos.

Em segundo lugar, os registros de acesso do nginx mostram três solicitações para um URL correspondente. x2 301 respostas e 1 200 respostas. Isso é esperado? Se assim for há uma maneira melhor de fazer isso para que haja apenas 1 pedido, pois parece que eu criei carga addtional 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;
}
    
por surry 13.10.2015 / 08:07

1 resposta

1

Resolvido 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;
}
    
por 11.04.2016 / 07:03