Как удалить завершающий слеш перед параметрами URL в Nginx

Как удалить завершающий слеш перед параметрами URL в Nginx

У меня есть простой сайт 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; }может работать лучше

Связанный контент