Nginx で URL パラメータの前の末尾のスラッシュを削除する方法

Nginx で URL パラメータの前の末尾のスラッシュを削除する方法

URL に関係なく単一の PHP ファイルを実行するシンプルな Nginx サイトがあります (CSS/JS ファイルは通常どおりに提供されます)

しかし、何をしても、複数のブラウザでテストしても、GET/URL パラメータを含めるたびに、 の直前に末尾のスラッシュが追加されます?。例:

  • example.com?test=1リダイレクト先 =>example.com/?test=1
  • example.com/path?test=1リダイレクト先 =>example.com/path/?test=1

これは私が現在使用している設定です

    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include                         fastcgi_params;
        fastcgi_index                   index.php;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_split_path_info         ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO         $fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }

これを防ぐ方法を誰か知っていますか?

答え1

議論されているnginxルールの1つに引っかかっていると思います ここそれは…と言います。

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

さらに議論があります。あなたの例の URI は実際には最初の場所指定 (明らかにスラッシュで終わる) によって処理されるので、リクエスト URI にスラッシュが追加されると思います。

次のような場所指定の方location ~ .*$ { commands; }がうまくいくかもしれない

関連情報