у меня есть 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;
}