Назад | Перейти на главную страницу

Nginx удаляет конечный вопросительный знак из URL

Я пытаюсь сделать правило перезаписи в Nginx, чтобы удалить пробный вопросительный знак (?) из URL-адресов, но я не могу это понять. Я сделал это для завершающих слэшей вот так:

#redirect all trailing slash URL's to the respective non trailing slash
rewrite ^/(.*)/$ /$1 permanent;

поэтому я решил, что то же самое сработает, просто заменив косую черту знаком вопроса:

rewrite ^/(.*)?$ /$1 permanent;

но это не сработало, но мне пришло в голову, что вопросительный знак имеет какое-то значение в регулярном выражении, поэтому я попытался избежать его:

rewrite ^/(.*)\?$ /$1 permanent;

но это тоже не сработало, я попытался также удалить первую косую черту:

rewrite ^(.*)\?$ $1 permanent;

но это тоже был провал, и да, я перезагружал сервер между тестами.

Вот что я пытаюсь сделать:

поэтому в основном удаляют вопросительный знак только в том случае, если нет строки запроса. Как я могу этого добиться?

Я проверил другие ответы, но они, похоже, хотят полностью удалить строку запроса, я хочу удалить только в том случае, если есть только вопросительный знак и нет параметров.

Ричард Смит дал мне ответ на SO, я оставлю ответ здесь также на тот случай, если кто-то остановится на этом:

if ($request_uri ~ ^(.*)\?$) { return 301 $1; }

Попробуйте следующее:

if ($is_args) {
    if ($args = "") {
        return 301 $uri;
    }
}

Я не тестировал это, поэтому не уверен, что это сработает. Все зависит от того, какое значение устанавливает nginx. $is_args когда в URL есть только вопросительный знак, а не аргументы.