Nginx:httpリクエストを別のポートに転送するにはどうすればよいですか?


65

私がやりたいのは

誰かがhttp://localhost/route/abcサーバーのレスポンスにアクセスすると、http://localhost:9000/abc

Nginxを次のように構成します。

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

httpリクエストは9000正しくポートにディスパッチされますが、受信したパスはhttp://localhost:9000/route/abcそうではありませんhttp://localhost:9000/abc

なにか提案を ?

回答:


65

ここでは微妙な点は嫌いですが、以下のように9000の最後に/を追加してみてください。転送されたリクエストに「ルート」が追加されなくなりました。

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}

4
これは受け入れられた答えでなければなりません。単純に追加すること/は、場所にリストされているプレフィックスを削除する方法として文書化されています。
バーナード

40

リライトを使用して、URLの余分な部分を削除できると思います。あなたの場合、私はあなたが使用できると思います:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

ただし、アプリに内部リンクがある場合、/ abc / fooを指す場合があります。これを行う場合、代わりに/ route / abc / fooを指す必要があるため、生のリクエストが正しく着信します。可能であれば、nginxの設定をそのままにして、代わりにサブディレクトリにあることを認識するようにアプリを設定する方が良い場合があります。

これは古い質問であることは知っていますが、同じ問題を解決しようとしていたとき、Googleのトップヒットでした!


ありがとう!このリンクでは、我々は変数のリスト確認できます。wiki.nginx.org/HttpProxyModule#Variables
エドガー・レアル

17

以下を試してください

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

このソリューションは、ホスト名を保持するので、私にとって最適に機能しました。
シャフィクジャマル

クリーンでシンプル。
ラフシャン・サマンダロフ

7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

このコードは8080でリッスンし、compute-1-36のポート8787にリダイレクトします。場所で他のパスを選択できます/

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