nginxプロキシパスリダイレクトはポートを無視します


34

したがって、nginx confでnode.jsアプリを指すときに仮想パスを設定しています。関連するセクションは次のようになります。

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

node.jsアプリ(高速アプリ)がリダイレクトを呼び出す場合を除いて、素晴らしい動作をします。

例として、devボックスはポート8080でnginxを実行しているため、ノードアプリのルートへのURLは次のようになります。

http:// localhost:8080 / app

ノードから「/ app」へのリダイレクトを呼び出すと、実際のリダイレクトは次のようになります。

http:// localhost / app


ここで使用を提案するいくつかの回答:proxy_set_header Host $ http_host; しかし、脆弱性(ホストヘッダー攻撃)を引き起こす可能性があるとは誰も言いませんでした。攻撃例はこちらそして詳細はこちら

回答:


14

問題は、Node.jsアプリケーションがリダイレクトを正しく発行していないことです。proxy_redirectnginxでこれを修正するために使用できる場合があります。

proxy_redirect http://localhost/ http://localhost:8080/;

47

Jginkinsがnginxの背後で実行されているという同じ問題を解決する必要がありました。私にとってそれは、HostJenkinsに送信されるヘッダーにサーバーポートを含めることでした。

proxy_set_header Host $host:$server_port;

お役に立てば幸いです。


3
ビンゴ。@mgorvenが言うように、ノードは、ひどくリダイレクトを設定しているnginxのはひどくホストに転送しているので
エリック・

5

上記のソリューションを試しましたが、ノードアプリケーションがロケーションヘッダーで「http://nodeapp.com:8080/new/location」などの完全修飾URLを発行するたびにすべて失敗しました

そこで、$ http_hostを使用してホストとポートを渡すことにしました。マッチを使用して〜^ URLを完全に書き換えます。

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

この場合、Nodeサーバーは8080で実行され、nginxプロキシは8000で実行されています。これは、ロケーションヘッダーのすべての完全修飾URLを書き換える必要があることを意味します。これが誰かを助けることを願っています!!


4

この質問に関する会話ごとに、適切な解決策はプロキシのHostヘッダーディレクティブを調整することです。

これを変更:

proxy_set_header Host $host;

これに:

proxy_set_header Host $http_host;

$http_hostポートを含むHTTP HOSTヘッダーで指定された値を保持します。リダイレクトは、OPのセットアップをさらにカスタマイズせずに、カスタムポートを選択する必要があります。

これらの回答(同じチケット)はさらに詳しく説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.