如何在 Nginx 中刪除 URL 參數前的尾部斜杠

如何在 Nginx 中刪除 URL 參數前的尾部斜杠

我有一個簡單的 Nginx 站點,無論 URL 如何,它都運行單個 PHP 文件(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 規則之一所困擾 這裡其中說...

如果位置由以斜線字元結尾的前綴字串定義,並且請求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pa​​ss 或 grpc_pass 之一處理,則執行特殊處理。為了回應 URI 等於此字串但沒有尾部斜線的請求,將傳回帶有代碼 301 的永久重定向到所請求的 URI,並附加斜線。如果不需要這樣做,可以像這樣定義 URI 和位置的精確匹配:

並且還有更多的討論。我認為您的範例 URI 實際上是由第一個位置規範(顯然以斜線結尾)處理的,因此請 URI 添加了斜線。

像這樣的位置規範location ~ .*$ { commands; }可能會更好

相關內容