URI перенаправления на NGINX

У меня есть страница на моем сайте (доступная только для зарегистрированных пользователей), которая выглядит следующим образом:

https://www.example.com/forum/new

Однако иногда, когда пользователи нажимают или обновляют страницу, они получают следующую страницу:

https://www.example.com/forum%252fnew

Теперь %25 декодируется в символ %, а %2f декодируется в "/", поэтому кажется, что URI кодируется дважды.

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

location ~ /forum%252Fnew {
    return 301 https://www.example.com/forum/new;
}

Я попытался экранировать % в расположении с помощью \, но, похоже, ни один из них не работает.

Что мне не хватает?


1
72
1

Ответ:

Решено

URI был декодирован и нормализован перед обработкой директивами location и rewrite, поэтому %25 выглядит как один %.

Пример в вашем вопросе показывает оператор регулярное выражениеlocation. Оператор ~ предназначен для сопоставления с учетом регистра, а оператор ~* — для сопоставления без учета регистра.

Чтобы пример в вашем вопросе работал, вам нужно изменить его на:

location ~* /forum%2Fnew

Или:

location ~ /forum%2fnew

Подробнее см. этот документ.