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

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

場所があります

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

http://example.com/pass/whateverつまり、URLをプロキシ化するはずですhttp://localhost:12345/whatever

気に入らないのは、nginxが自動的にスラッシュを追加することです

http://example.com/pass

http://example.com/pass/301リダイレクト経由で

この動作を簡単に回避するにはどうすればよいでしょうか。/pass末尾のスラッシュなしで別の場所に移動したいです。よろしくお願いします。

答え1

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

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

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

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

/pass locationたとえば、既存のものに加えて明示的に作成する必要があります。/pass/そうしないと、暗黙のものlocation /pass {return 301 /pass/…;}が作成されます。

/passしかし、本当に自分がしようとしていることをやりたいのでしょうか?からへのリダイレクトを省略する場合/pass/、相対パスは機能しません。また、新しいブラウザの中には、末尾のスラッシュがユーザーに表示されない欠陥のある UI/UX を備えているものもあり、その違いをトラブルシューティングしようとすると、さらに混乱を招く可能性があります。

答え2

あなたが望むように別の場所自然な解決策は、その場所を追加することです

location /pass {
}

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

他にも使える

location = /pass {
}

nginx が一致を少し速く見つけられるようにします。

関連情報