ПРОЕКТЫ 


  АРХИВ 


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 - пропадают аргуме нты



Hello!

On Sun, Feb 27, 2011 at 12:59:54PM -0500, green wrote:

> >> Когда делаю что-то подобное:
> >>
> >> location ~ ^/test(/.*\.php)$ {
> >>     proxy_pass http://cgi$1;
> >> }
> >>
> >> То в запросе не передаются аргументы,
> >> т.е. запрос:
> >> http://server/test/xxx.php?param
> >> преобразуется в:
> >> http://cgi/xxx.php
> >> (без аргументов)
> >
> > Если вы задаёте url в proxy_pass с
> использованием переменных - вы
> > задаёте его полностью. Поскольку
> аргументы в формируемый url вы
> > не включили - их там и нет.
> 
> Я бы не сказал что дело именно в
> переменных. Дело вроде как в указании
> пути. Т.е. если есть хотя бы / в конце, то
> всё пропадает. Этого не написано в
> документации. При этом rewrite ведёт себя
> иначе (что описано в документации). И
> из-за этого возникает конфуз с
> пониманимем работы proxy_pass.

Начиная с вот этого изменения в 0.8.25:

    *) Feature: now URI part is not required a "proxy_pass" directive if 
       variables are used.

если в proxy_pass с переменными не указан uri, то он ведёт себя 
как "обычный" proxy_pass без uri.

> > Отдельно при таком способе задания
> доставит необходимость
> > самостоятельно следить за
> корректностью получаемого url'а, в
> > частности - escape'ингом спецсимволов.
> Вышеприведённый конфиг
> > замечательно ломается от запросов
> вида "/test/blah%0D%OA.php".
> 
> Это мне кажется странным. Чем это
> принципиально отличается от того,
> когда nginx сам копирует URI вместо
> выделенной мною части?

Когда nginx сам копирует uri - он знает, что надо escape'ить, а 
что нет.  Если же используются переменные - то случаи

   proxy_pass http://backend$request_uri;

и

   proxy_pass http://backend$uri;

с точки зрения nginx'а не отличимы, однако в первом случае 
escape'ить ничего не надо, а во втором - надо.

[...]

> > Вообще, proxy_pass с переменными - он для
> случаев, когда хочется
> > странного, а не для нормальной работы.
> Не надо его использовать
> > без нужды.
> 
> Ещё раз. Описанное проявляется не
> только с "переменной", но и с
> "постоянной"!

Если в proxy_pass переменные не используются - то никакие 
аргументы никуда не пропадают.  Если у вас пропадают - попробуйте 
ещё раз.

[...]

> > location /test/ {
> > proxy_pass http://backend/;
> > }
> 
> А это работать не будет :). Т.к. стоит
> слеш в конце.

Будет.

> > Если нужно проксировать только *.php, то
> rewrite - меньшее зло.
> 
> Ну мне ещё причины хотелось бы
> услышать, т.к. их чаще всего легче
> запомнить и понять, чем набор юз-кейсов
> для всех возможных случаев.

Причину я описал чётко и ясно: proxy_pass с переменными требует 
очень бережного обращения, и написать его правильно - куда более 
сложная задача, чем правильно написать rewrite.

Maxim Dounin

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


 




Copyright © Lexa Software, 1996-2009.