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 mailing list
nginx-ru@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru