У меня есть блок location
, как показано ниже
location ^api/([^/]+)(/.+)$ {
set $my_host $1;
set $my_path $2;
proxy_pass http://$myhost$my_path$is_args$args;
}
Это хорошо работает для большинства обычных случаев для URI, таких как / api / foo / bar? 1234
.
Однако, когда я ввожу специальные значения в кодировке URL, дела идут плохо. Когда URI равен / api / foo / bar [% 7B% 7D]
, $ my_path
декодируется и передается в $ my_host
как / foo / bar [{}]
. Это недействительный URL.
Я попытался обойти ограничения NGINX, используя условие для сопоставления с $ request_uri
и $ uri
, но результаты кодируются либо с двойным, либо без кодирования.
location ~* ^api/([^/]+)(/.+)$ {
set $my_host $1;
if ( $request_uri ~* ^api/([^/]+)(/.+)$ ) {
set $my_path $2;
}
proxy_pass http://$myhost$my_path$is_args$args;
}
В приведенном выше случае $ my_path
равно / foo / bar [% 257B% 257D]
.
Я также попытался использовать set_unescape_uri
из модуля set misc для второго регулярного выражения.
Как я могу заставить NGINX удалить компоненты пути в том же формате, который предоставил клиент?
Думаю, что-то не так с set_unescape_uri
и переменной регулярного выражения или чем-то еще. Использование формы с одним аргументом set_unescape_uri
работает.
location ~* ^api/([^/]+)(/.+)$ {
set $my_host $1;
if ( $request_uri ~* ^api/([^/]+)(/.+)$ ) {
set $my_path $2;
set_unescape_uri $my_path;
}
proxy_pass http://$myhost$my_path$is_args$args;
}