Удаление сегментов пути с закодированными значениями для 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 удалить компоненты пути в том же формате, который предоставил клиент?

1
задан 27 April 2016 в 13:41
1 ответ

Думаю, что-то не так с 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;
}
0
ответ дан 4 December 2019 в 06:22

Теги

Похожие вопросы