web-dev-qa-db-ja.com

末尾のスラッシュによるnginxの不要な場所のリダイレクト

場所があります

location /pass/ {
    proxy_pass http://localhost:12345/;
}

したがって、URLをプロキシ化することになっていますhttp://example.com/pass/whateverからhttp://localhost:12345/whatever

私がそれについて好きではないことは、nginxが自動的にスラッシュを追加することです

http://example.com/pass

そしてそれをhttp://example.com/pass/ 301リダイレクト経由

この動作を回避するにはどうすればよいですか。が欲しいです /pass別の場所に移動するための末尾のスラッシュなし。前もって感謝します!

8
igor

別の場所に移動したいので、自然な解決策はその場所を追加することです

location /pass {
}

デフォルトでは、nginxはWebルートで「pass」と呼ばれるファイルを探します。このデフォルトが気に入らない場合は、この新しいロケーションブロック内にディレクティブを追加して、それを実現できます。

あなたも使うかもしれません

location = /pass {
}

nginxが一致を少し早く見つけることができるように。

2
Chuan Ma

_proxy_pass_で終わるlocationを持つ_/_が、バックエンドに移動せずに自動的に暗黙的な_301_リダイレクトになる特殊なケースがあります。これを回避するには、末尾のスラッシュなしで明示的にlocationを作成する必要があります。

場所がスラッシュ文字で終わるプレフィックス文字列によって定義され、リクエストがproxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pa​​ss、またはgrpc_passのいずれかによって処理される場合、特別な処理が実行されます。 URIがこの文字列と等しいが末尾のスラッシュがないリクエストに応答して、コード301の永続的なリダイレクトが、スラッシュが追加されたリクエストされたURIに返されます。これが望ましくない場合は、URIと場所の完全一致を次のように定義できます。

_location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}
_

たとえば、既存の_/pass_に加えて明示的な_/pass/_ locationを作成する必要があります。それ以外の場合は、暗黙的な_location /pass {return 301 /pass/…;}_が作成されます。

しかし、本当に自分がやろうとしていることを実行したいのですか? _/pass_から_/pass/_へのリダイレクトを省略する場合、相対パスは機能しません。一部の新しいブラウザでは、UI/UXに欠陥があり、末尾のスラッシュが表示されない傾向があるため、区別のトラブルシューティングを行う際に混乱が生じる可能性があります。

2
cnst