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

Maxim Dounin mdounin на mdounin.ru
Ср Фев 23 05:50:07 MSK 2011


Hello!

On Tue, Feb 22, 2011 at 06:31:03PM -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 вы 
не включили - их там и нет.

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

Ну и в качестве дополнительного бонуса - соответствующий upstream 
должен быть либо явно описан, либо должен быть настроен resolver 
(и соответственно будет делаться resolve регулярно).

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

> Если же делать:
> 
> location ~ \.php$ {
>     rewrite ^/test(/.*\.php)$ $1 break; # без него тоже
> передаётся, но необрезанное
>     proxy_pass http://cgi;
> }
> 
> То всё передаётся. В документации
> ничего вроде не нашёл про это, зато там
> написано, что если указывать proxy_pass без
> uri, то ему передастся запрос as-is, без
> сокращения слешей и т.п.
> Это баг или фича? И что меньшее зло - rewrite
> или добавлять $is_args$args в proxy_pass?

Правильно - разделять код и данные, и делать

    location /test/ {
        proxy_pass http://backend/;
    }

Если нужно проксировать только *.php, то rewrite - меньшее зло.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru