web-dev-qa-db-ja.com

URIを変更したNGINX proxy_pass

URLの1つのセクションを削除して、いくつかのリクエストをプロキシ(GlassFishを実行)に渡す必要があります。例えば:

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

次のようにプロキシに渡す必要があります:

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

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

しかし、残念ながら、パラメーターなしで渡すリクエストです。したがって、GlassFishのアクセスログでは、次の情報のみを確認できます。

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

何を間違えたか? URLパラメータも渡す方法は?

ありがとうございました。

4
Andrey

からnginxのドキュメント(コンテキスト:プレフィックスの場所)

Proxy_passディレクティブがURIで指定されている場合、リクエストがサーバーに渡されると、正規化されたリクエストURIの場所に一致する部分が、ディレクティブで指定されたURIに置き換えられます。

したがって、次のように簡略化できます。

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;
}
6
Xavier Lucas

あなたの質問のために、これはあなたのために働くでしょう。正規表現を使用します。

location ^~ /jazz/ {
    rewrite ^/jazz/(.*)$ /$1? break;
    proxy_pass http://vito_api;
}
2
Shengwen Peng

私はこれが古い質問であることを知っていますが、私はこれを探していて、別の質問を見つけ、最も簡単な解決策を信じています。 proxy_passの使用中はuriを使用できませんが、変数として使用できます。ここのような:

location  ~ ^/app/(.*)$ {
# proxy_pass   http://127.0.0.1/some_dir;       # error
proxy_pass   http://127.0.0.1/some_dir/$1;      # ok
}
1
Donm