Назад | Перейти на главную страницу

Удаление сегментов пути с закодированными значениями для nginx

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