Re: proxy pass - пропадают аргументы

Maxim Dounin mdounin на mdounin.ru
Пн Фев 28 13:15:15 MSK 2011


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