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