Welcome! Log In Create A New Profile

Advanced

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

Maxim Dounin
February 28, 2011 05:16AM
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@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

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

Maxim Dounin February 22, 2011 09:52PM

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

green February 27, 2011 12:59PM

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

Maxim Dounin February 28, 2011 05:16AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 108
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready