NGINX proxy_pass com modificação de URI

4

Eu preciso passar algumas solicitações para o proxy (executando o GlassFish) com a remoção de uma seção da URL. Por exemplo:

https://xxx.net/jazz/MobileApi?id=2&make_id=4

Deve ser passado para o proxy como:

http://X.X.X.X:8080/MobileApi?id=2&make_id=4

Tenho a seguinte configuração do Nginx:

upstream vito_api {
    server 178.63.X.X:8080;
}

server {
    listen 80;
    listen 443 ssl;
    ....

    location ~ /jazz/(?<section>.*) {
       proxy_pass http://vito_api/$section/;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Mas, infelizmente, solicite a passagem sem parâmetros. Então, nos logs de acesso do GlassFish, eu posso ver apenas:

"148.251.X.X" "NULL-AUTH-USER" "05/Jan/2015:15:18:40 +0100" "GET /MobileApi/ HTTP/1.0" 200 21

O que eu fiz de errado? Como passar parâmetros de URL também?

Obrigado.

    
por Andrey 05.01.2015 / 15:27

4 respostas

5

De documentação do nginx (contexto: localização prefixada)

If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive.

Assim, pode ser simplificado com o seguinte:

location /jazz/ {
    proxy_pass http://vito_api/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
    
por 05.01.2015 / 21:12
2

Para sua pergunta, isso funcionará para você. Use regex.

location ^~ /jazz/ {
    rewrite ^/jazz/(.*)$ /$1? break;
    proxy_pass http://vito_api;
}
    
por 13.12.2016 / 11:59
0

Eu sei que esta é uma pergunta antiga, mas eu estava procurando por isso e encontrei outra e acredito na solução mais fácil. Enquanto estiver usando proxy_pass você não pode usar o uri, mas você pode usá-lo como variável. Como aqui:

location  ~ ^/app/(.*)$ {
# proxy_pass   http://127.0.0.1/some_dir;       # error
proxy_pass   http://127.0.0.1/some_dir/$1;      # ok
}
    
por 12.09.2018 / 12:22
-1

Andrey, isso não vai funcionar. Você, como sempre, super engenharia. :) Mantenha simples, idiota! :)

De acordo com o documento nginx:

In some cases, the part of a request URI to be replaced cannot be determined:

When location is specified using a regular expression. In this case, the directive should be specified without a URI.

Então, por favor,

proxy_pass http://vito_api;
    
por 05.01.2015 / 16:10