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