![Как удалить завершающий слеш перед параметрами URL в Nginx](https://rvso.com/image/1684242/%D0%9A%D0%B0%D0%BA%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B0%D1%8E%D1%89%D0%B8%D0%B9%20%D1%81%D0%BB%D0%B5%D1%88%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%20%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%B0%D0%BC%D0%B8%20URL%20%D0%B2%20Nginx.png)
У меня есть простой сайт Nginx, который запускает один PHP-файл независимо от URL (за исключением файлов 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; }
может работать лучше