nginx modificar e URL do proxy

1

Novato Ngnix aqui. Por favor, eu preciso de alguma ajuda para descobrir como fazer corretamente nginx modificar e redirecionar (proxy?) Pedidos de entrada. O redirecionamento parece funcionar bem, mas o URL não é reescrito no destino.

Minha configuração é:

        server {

       listen 91 default_server ssl;

       ssl_prefer_server_ciphers on;
       ssl_certificate /etc/nginx/ssl/domain.crt;
       ssl_certificate_key /etc/nginx/ssl/domain.key;

        location /dest {

        rewrite ^a_service_prod&id_number=((1234701|1234708|1234802|1234808|1234812|1234902)\d+)&(.*?)$ /dest?service=a_service_prod.sub_service&operation=sub_service&id_number=$1&$2 break;
            proxy_pass http://192.168.1.1:1440;
            proxy_redirect off;
            proxy_set_header Host $host;
        }
    }

Estou tentando receber solicitações como /dest?service=a_service_prod&id_number=12347016734696&slime=somethig para ser reescrito e o pedido enviado para outro servidor como http://192.168.1.1:1440/dest?service=a_service_prod.sub_service&operation=sub_service&id_number=12347016734696&slime=somethig

Mas, no destino, o que é recebido é http://192.168.1.1:1440/dest?service=a_service_prod&id_number=12347016734696&slime=somethig

Por favor, o que estou fazendo de errado e como posso corrigi-lo?

    
por Sina 21.05.2018 / 17:46

1 resposta

3

O método atual não funciona porque você está tentando capturar a string de consulta na expressão regular de uma diretiva rewrite . nginx usa um URI normalizado para avaliar as diretivas rewrite e location , o que não inclui o ? nem nada que o segue.

Você pode encontrar a string de consulta na variável $request_uri , a variável $args - ou dividir entre as variáveis $arg_xxx . Consulte este documento para obter detalhes.

Você pode aplicar uma expressão regular a uma dessas variáveis usando uma instrução if ou map .

O exemplo abaixo usa uma diretiva map (consulte este documento para obter detalhes) com uma expressão regular e duas capturas nomeadas para reconstruir sua lista de argumentos obrigatórios. O URI upstream é anexado à diretiva proxy_pass (consulte este documento para obter detalhes).

map $args $newargs {
    default $args;
    ~*^(?<prefix>service=a_service_prod)&(?<suffix>id_number=(?:1234701|1234708|1234802|1234808|1234812|1234902)\d+&.*)$  $prefix.sub_service&operation=sub_service&$suffix;
}
server {
    ...
    location /dest {
        proxy_pass http://192.168.1.1:1440$uri?$newargs;
        ...
    }
}
    
por 21.05.2018 / 20:00