我有一個簡單的 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_pass 或 grpc_pass 之一處理,則執行特殊處理。為了回應 URI 等於此字串但沒有尾部斜線的請求,將傳回帶有代碼 301 的永久重定向到所請求的 URI,並附加斜線。如果不需要這樣做,可以像這樣定義 URI 和位置的精確匹配:
並且還有更多的討論。我認為您的範例 URI 實際上是由第一個位置規範(顯然以斜線結尾)處理的,因此請 URI 添加了斜線。
像這樣的位置規範location ~ .*$ { commands; }
可能會更好