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
|