У меня есть страница на моем сайте (доступная только для зарегистрированных пользователей), которая выглядит следующим образом:
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;
}
Я попытался экранировать % в расположении с помощью \, но, похоже, ни один из них не работает.
Что мне не хватает?
URI был декодирован и нормализован перед обработкой директивами location
и rewrite
, поэтому %25
выглядит как один %
.
Пример в вашем вопросе показывает оператор регулярное выражениеlocation
. Оператор ~
предназначен для сопоставления с учетом регистра, а оператор ~*
— для сопоставления без учета регистра.
Чтобы пример в вашем вопросе работал, вам нужно изменить его на:
location ~* /forum%2Fnew
Или:
location ~ /forum%2fnew
Подробнее см. этот документ.