web-dev-qa-db-ja.com

Nginxリバースプロキシリダイレクトでポートを非表示にする

私の設定は次のとおりです。

  • ウェブサーバー:アプリはポート8529でリッスンしています。
  • リバースプロキシ:ポート80でリッスンしているNginx。

問題は、私のNginxがリクエストをポート8529にリダイレクトし、これがhttp://some.domain.com:8529/fooのようにURLに表示されることです。これは、私が達成したいことではありません。

私の現在のnginxsites-available関連ファイルは次のとおりです。

server {

  listen 80;
  server_name some.domain.com;

  location / {
    proxy_pass http://localhost:8529/foo;
    proxy_redirect off;
    proxy_set_header        Host            $Host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-NginX-Proxy   true;
  }

}

some.domain.com/etc/hosts内にあり、127.0.0.1を指している場合。

ヒントはありますか?

2
jarandaf

プロキシ中にポートを非表示にするには、サーバー本体に次の2行が必要です。

server_name_in_redirect off;
proxy_set_header Host $Host:$server_port;

Confは次のようなものです:

server
{
listen 80;
server_name example.com;
server_name_in_redirect off;
proxy_set_header Host $Host:$server_port;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080;
}
access_log off;
}
4
Dark.Passenger

アップストリームサーバーがリダイレクトを発行し、nginxがproxy_redirect off;でそれを書き換えることを禁止し、proxy_passディレクティブの末尾にスラッシュがないか、アプリケーションがこれらのURLを構築しています。

注:Alexeyが言ったように、この場合、nginxはロケーションプレフィックスに一致する正規化されたURIの一部、つまり/を削除してから、proxy_pass URIに追加するため、末尾のスラッシュが重要です。したがって、バックエンドサーバーは/foobarでリクエストを受信しますが、おそらく/foo/barを待っています。

1
Xavier Lucas