Re: Помогите разобраться с proxy pass uri decode
Maxim Dounin
mdounin на mdounin.ru
Вт Ноя 21 13:18:32 UTC 2017
Hello!
On Tue, Nov 21, 2017 at 05:11:54AM -0500, bodomic wrote:
> Уже, кажется, все идеи перепробовал, ничего не помогает.
> Попробую максимально точно описать проблему: На вход фронтенда приходит урл
> с encoded символами, среди которых есть %20. На proxy_pass этот %20
> обращается обратно в пробел и всё ломается.
> В простейшей конфигурации имеем:
> Nginx:
>
> location ~ ^/api(.*) {
> proxy_pass http://backend/api.php?q=$1;
> }
>
> Apache (backend):
> "GET /api.php?q=blabla1 blabla2"...
>
>
> Ну и в логе ошибка "/api.php?q=blabla1 не валидный запрос без blabla2".
> Я уже бессчётное количестко подходов сделал к экранированию и переписыванию
> переменных, нужен divine intervention, который скажет, как правильно,
> видимо.
Проблема в том, что location работает с раскодированным URI
запроса (и соответственно в $1 попадает раскодированная часть
URI), а proxy_pass с переменными ожидает полностью сформированный
и правильно закодированный URI, как например в конструкции
proxy_pass http://127.0.0.1$request_uri;
Для задачи "поменять URI запроса на /api.php?q=..." проще всего
использовать rewrite, благо он умеет правильно кодировать URI при
его изменении.
Как-то так должно заработать (untested):
location /api/ {
rewrite ^/api(/.*) /api.php?q=$1? break;
proxy_pass http://backend;
}
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru