ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: proxy pass и параметры в виде переменных



On Tue, Jul 27, 2010 at 01:22:38PM +0400, Emil Muratov wrote:

>   On 07/27/2010 12:46 PM, Igor Sysoev wrote:
> > On Tue, Jul 27, 2010 at 12:12:21PM +0400, Emil Muratov wrote:
> >
> >>> Приветствую, All
> >>>
> >>> Настраивал nginx фронтом к плону,
> >>> наткнулся на грабли. Нжинкс не эскейпит
> >>> пробелы в запросах к бекэнду.
> >>> Очень похоже на багу описанную здесь
> >>> http://forum.nginx.org/read.php?21,107888 но немного в
> >>> другой конфигурации.  nginx version: nginx/0.8.44
> >>>
> >>> Если описать конфиг так:
> >>>
> >>>
> >>>
> >>> server {
> >>>           listen       *:80;
> >>>           server_name  tst.plone.lan site.plone.lan mgmt.plone.lan
> >>>
> >>>           set $backend  http://localhost:8080;
> >>>           set $zope_prefix
> >>> /VirtualHostBase/http/$host/w/Site.Plone.Lan/Main/VirtualHostRoot;
> >>>
> >>>       location /  {
> >>>           proxy_set_header   Host             $host;
> >>>           proxy_pass $backend$zope_prefix$uri;
> >>>       }
> >>> }
> >>>
> >>>
> >>>
> >>> То нжинкс передает запросы в зоп
> >>> заменяя исходные %20 на "пробелы".
> >>>
> >>> В логах нжинкса запрос выглядит как
> >>>
> >>>
> >>> 192.168.1.20  - - [23/Jul/2010:16:20:36 +0400] "GET
> >>> /portal_javascripts/Plone%20Tableless/toc.js HTTP/1.1" 200 2129 "-"
> >>> "Opera/9.80 (X11; Linux i686; U; en) Presto/2.5.29 Version/10.60"
> >>>
> >>>
> >>>
> >>> А в зоп он  приходит так
> >>>
> >>>
> >>> 127.0.0.1 - Anonymous [23/Jul/2010:16:23:39 +0400] "GET
> >>> /VirtualHostBase/http/site.plone.lan/w/Site.Plone.Lan/Main/VirtualHostRoot/portal_javascripts/Plone
> >>> Tableless/toc.js HTTP/1.0" 400 269 "http://lbg.pik.ru/kupit-kvartiru";
> >>> "Mozilla/5.0 (compatible; Konqueror/4.4; Linux) KHTML/4.4.5 (like Gecko)
> >>> SUSE"
> >>>
> >>>
> >>>
> >>> т.е. пробел в строке /Plone Tableless/
> >>> передается в виде именно пробела.
> >>>
> >>> Если описать конфиг так:
> >>>
> >>>
> >>> server {
> >>>           listen       *:80;
> >>>           server_name  tst.plone.lan site.plone.lan mgmt.plone.lan
> >>>
> >>>       location /  {
> >>>           rewrite     ^/(.*)$
> >>> /VirtualHostBase/http/$host/w/Site.Plone.Lan/Main/VirtualHostRoot/$1
> >>> break;
> >>>
> >>>           proxy_set_header   Host             $host;
> >>>           proxy_pass http://localhost:8080;
> >>>       }
> >>> }
> >>>
> >>>
> >>>
> >>> то все работает нормально, все пробелы
> >>> в урлах преобразуются в %20. Однако
> >>> хотелось бы использовать переменные в
> >>> proxy_pass и избавится от лишних реврайтов.
> >>>
> >>> Или я где-то что-то пропустил или одно
> >>> из двух.
> >>> Буду признателен за помощь.
> >>>
> >>
> >> Поковырялся еще немного.
> >> Если написать так:
> >>           proxy_pass $backend$zope_prefix$request_uri;
> >>
> >> то пробелы в урле нормально преобразуются в %20.
> >>
> >> А если так:
> >>           proxy_pass $backend$zope_prefix$uri;
> >>
> >> то соответственно не преобразуются и бекэнд отдает ошибку 400.
> >>
> >> Собственно вопрос - баг или фича? Неужели никто ничего не подскажет?
> > Это фича. Вообще, тут достаточно такой конфигурации:
> >
> >       location /  {
> >           proxy_pass        
> > http://localhost:8080/VirtualHostBase/http/$host/w/Site.Plone.Lan/Main/VirtualHostRoot$request_uri;
> >           proxy_set_header   Host   $host;
> >       }
> >
> > без этих set'ов и rewrite'ов.
> >
> > "proxy_pass $backend$zope_prefix$request_uri" работает, потому что
> > эти %20 есть в изначльном запросе.
> >
> 
> Спасибо за комментарий.
> 
> Ну это слишком простой случай с одним локейшеном.
> Некоторые урлы все же надо переписывать в разных местах, а конструкция
> 
> location /  {
>           proxy_pass        
> http://localhost:8080/VirtualHostBase/http/$host/w/Site.Plone.Lan/Main/VirtualHostRoot$uri;
>           proxy_set_header   Host   $host;
>       }
> 
> в этом случае уже не работает.

Да, потому что nginx в общем случае не знает, что нужно эскейпить.

> set'ы для того чтобы в нескольких локейшенах не писать одно и тоже, хотя 
> вобщем-то без этого можно обойтись.
> Но пробелы в $uri все равно не работают :( Видимо придется что-то 
> придумывать в обход.

Вообще, правильный подход - делать отдельные сервера:

server {
    server_name  tst.plone.lan;

Тогда можно писать так:

    location /  {
          proxy_pass      
http://localhost:8080/VirtualHostBase/http/tst.plone.lan/w/Site.Plone.Lan/Main/VirtualHostRoot/;
           proxy_set_header   Host   $host;
       }
}


-- 
Игорь Сысоев
http://sysoev.ru

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.