28

A と B の 2 つのサーバーがあります。サーバー A は世界中でアクセスされます。彼はnginxをインストールしています。それは私がconfに持っているものです:

location /test {
  proxy_pass http://localserver.com;
}

すべきことは、アドレスhttp://globalserver.com/test (つまりサーバー A) を内部サーバー アドレスhttp://localserver.comに変換することです。ただし、場所のパスを追加します。つまり、まったく利用できないhttp://localserver.com/testを探します。場所の最後の部分を捨てて、プロキシを正しいアドレスに渡すにはどうすればよいですか?

4

3 に答える 3

52

それはうまくいくはずです。Nginxは、アップストリームローカルサーバーの「/test」パスを削除する必要があります。だから私が言えることはそれが原因ではないということです。それを少し良くするために、これを試してください:

location /test/ {
  proxy_pass http://localserver.com/;
}

たとえば、最初の2行に追加した2つのスラッシュは、「/ testABC」と誤って一致し、誤った要求をアップストリームローカルサーバーに送信することを回避します。

ありますか

proxy_redirect

同じ場所のブロックの行?アップストリームローカルサーバーにリダイレクトがある場合、その行の間違いはあなたが説明したような問題を引き起こします。

[更新]元の構成が機能せず、私の構成が機能する根本的な原因を見つけました。proxy_passディレクティブにURIパス自体がない場合、nginxはURIパス部分を置き換えません。したがって、最後にスラッシュを追加するという私の修正(スラッシュはURIパスとして扱われます)は、URIパスの置換をトリガーします。

参照:http ://wiki.nginx.org/HttpProxyModule#proxy_pass

未処理の形式でURIを送信する必要がある場合は、URI部分なしでディレクティブproxy_passを使用する必要があります

location  /some/path/ {
  proxy_pass   http://127.0.0.1;
}
于 2013-03-14T12:36:35.917 に答える
1

ここで指定されているように追加してみてくださいhttp://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass :

      proxy_pass http://localserver.com/;
于 2013-03-12T10:57:14.637 に答える
-1

書き直してみる

location /test {
    rewrite ^ $scheme://$host/;
    proxy_pass http://localserver.com;
}

いくつかの役立つリンク...

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

http://wiki.nginx.org/落とし穴

于 2013-03-14T07:40:44.530 に答える