Re: proxy pass и urlencode url's

Maxim Dounin mdounin at mdounin.ru
Mon Oct 8 10:08:25 UTC 2012


Hello!

On Mon, Oct 08, 2012 at 04:38:24AM -0400, buylov wrote:

> Здравствуйте.
> Есть open proxy на nginx  , имеет следующий вид
> 
> location ~ /proxy/ {
>     resolver 8.8.8.8;
>     rewrite ^/proxy/(.*)$ /$1 break;
>     proxy_pass http://$1;
> }
> При запросах на urlencode url's, в частности содержащие %20, иногда
> возвращается 404 ошибка.
> При тестировании на своей стороне - все в порядке, но при запросе через
> прокси в лог попадает без %20, то есть пишется просто " ". Судя по тексту
> ошибки ,другой сервер воспринимает запрос до первого пробела. Что с этим
> можно сделать?

Если вы указываете proxy_pass с переменными, то правильно 
сформировать URL - это ваша задача.  Поскольку $1 в вашем случае 
не url-encoded - наблюдается то, что наблюдается.

Наиболее правильный путь решения проблемы - не делать так.  Но 
если очень хочется, то можно попробовать воспользоваться одним из 
предложенных ниже вариантов решения:

1) Использовать то, что сформировала директива rewrite, благо она 
должна всё заэкранировать.  Для этого следует в proxy_pass 
указывать *только* имя хоста, и убедится, что использется свежий 
nginx (1.1.12+, если не ошибаюсь).  Конфиг будет какой-то такой:

    rewrite ^/proxy/(?<h>[^/]+)(/.*)$ $2 break;
    proxy_pass http://$h;

2) Брать исходно полученный от клиента $request_uri 
(соотвтетсвенно - url-encoded клиентом) и работать с ним.

    set $d "";
    if ($request_uri ~ "^/proxy/(.*)") {
        set $d $1;
    }

    proxy_pass http://$d;


-- 
Maxim Dounin
http://nginx.com/support.html



Подробная информация о списке рассылки nginx-ru