Я пытаюсь сделать правило перезаписи в 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;
но это тоже был провал, и да, я перезагружал сервер между тестами.
Вот что я пытаюсь сделать:
www.mysite.com?
следует перенаправить на wwww.mysite.com
www.mysite.com/some/path?
следует перенаправить на wwww.mysite.com/some/path
www.mysite.com?some=vars
должен остаться без изменений.www.mysite.com/some/path?some=vars
должен остаться без изменений.поэтому в основном удаляют вопросительный знак только в том случае, если нет строки запроса. Как я могу этого добиться?
Я проверил другие ответы, но они, похоже, хотят полностью удалить строку запроса, я хочу удалить только в том случае, если есть только вопросительный знак и нет параметров.
Ричард Смит дал мне ответ на SO, я оставлю ответ здесь также на тот случай, если кто-то остановится на этом:
if ($request_uri ~ ^(.*)\?$) { return 301 $1; }
Попробуйте следующее:
if ($is_args) {
if ($args = "") {
return 301 $uri;
}
}
Я не тестировал это, поэтому не уверен, что это сработает. Все зависит от того, какое значение устанавливает nginx. $is_args
когда в URL есть только вопросительный знак, а не аргументы.