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