Nginxはポート80で実行されています。これを使用して、パス/foo
からポート3200
へのプロキシURLを次のようにリバースします。
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $Host;
}
これは正常に動作しますが、ポート3200
にアプリケーションがあり、最初の/foo
を送信したくない場合があります。つまり、http://localhost/foo/bar
にアクセスするとき、/bar
だけをアプリが受け取ったパスにしたいと思います。だから私はこの行を上のロケーションブロックに追加してみました:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
これにより302リダイレクト(URLの変更)が発生しますが、301が必要です。どうすればよいですか?
Localhostへのリダイレクトは、リモートシステム(クライアントのWebブラウザなど)からは意味がありません。したがって、 rewrite flags パーマネント(301)またはリダイレクト(302)は、このケースでは使用できません。
透過的な書き換えルールを使用して次の設定を試してください:
location /foo {
rewrite /foo/(.*) /$1 break;
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $Host;
}
使用する curl -i
書き換えをテストします。ルールに微妙な変更を加えると、nginxがリダイレクトを実行する可能性があります。
Proxy_passディレクティブでURIを指定している限り、書き換えルールを使用しなくても、単純なロケーションプレフィックスマッチングが機能します。
location /foo {
proxy_pass http://localhost:3200/;
}
/
ディレクティブの最後にある追加のproxy_pass
に注意してください。 NGINXは一致した接頭辞/foo
を取り除き、残りをURI /
のバックエンドサーバーに渡します。したがって、http://myserver:80/foo/bar
はhttp://localhost:3200/bar
のバックエンドに投稿します。
Proxy_passディレクティブがURIで指定されている場合、リクエストがサーバーに渡されると、正規化されたリクエストURIの場所に一致する部分が、ディレクティブで指定されたURIに置き換えられます。
絶対的に最も正しい方法とベストプラクティスは、通常次のとおりです。
location /foo/ {
proxy_pass http://localhost:3200/; # note the trailing slash!
}
proxy_pass
変数を自動的に変更して、フロントエンドの$uri
がバックエンドの/foo/
に対応するように、末尾のスラッシュで/
の重要性に注意してください。明示的なrewrite
ディレクティブは不要です。
さらに、location
の末尾の/
も非常に重要であることに注意してください。これがないと、サイトのURLが変に見える可能性があります(例:/fooen
in /foo/en
に加えて)。
さらに、/
を使用したlocation
の末尾のproxy_pass
も、location
ディレクティブのドキュメントに従って、いくつかの特別な処理を保証し、暗黙のlocation = /foo {return 301 /foo/;}
も効果的に引き起こします。
したがって、上記のように末尾にスラッシュを付けてlocation
を定義することで、/fooen
のようなスラッシュのないサフィックスURLが無効になるだけでなく、末尾にスラッシュがない/foo
も引き続き機能するようになります。
リファレンスドキュメント:
試す
location /foo {
proxy_pass http://localhost:3200/;
....
または
location ^~ /foo {
proxy_pass http://localhost:3200/;
....
@Terabuckまだ返信がないため申し訳ありません。
Localhostは、アプリケーションがホストファイルのあるサーバーで実行されているという事実に依存しているため、使用しないでください。ローカルホストは、127.0.0.1へのデフォルトの変換にすぎません。このhostsファイルが必要であることを示すものは何もありません。持っていることは非常に一般的です。
ループバックインターフェイスを持つことも、依存する別の一般的なことですが、ネットワークスタック上のループバックインターフェイスに依存しています。これら2つを持たないのはまれなケースです。あなたがこれについて心配するならば。少なくともunix/linuxでは、ソケットのオプションがあります。これにより、ネットワークスタックがローカルホストに到達する必要がなくなります。ホストOSにはいくつかの要因があるため、このアプローチには注意が必要です。開いているファイルの数など。