ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: неправильный HTTP GET request с переменными в конфиге



On Mon, Dec 21, 2009 at 10:51:38AM -0500, anatoly wrote:

> похоже nginx создает некорректные http requests когда в config server, 
> location есть proxy_path с переменными, например
> proxy_pass        http://$1.site.com/;
> proxy_redirect    http://$1.site.com/ http://$1.ru.site.com/;
> ошибка происходит когда request url более сложный чем "/" вроде 
> http://some.ru.site.com/more/complex.html
> происходит обрезание request url до "GET / HTTP/1.0" вместо корректного "GET 
> /more/complex.html HTTP/1.0"
> 
> насколько я понимаю проблема в ngx_http_proxy_module.c 
> когда есть хоть одна переменная в proxy uri - инициализация модуля 
> компилирует конфиг
> и заполняет список в конфиге cnf->proxy_lengths 
> и когда cnf->proxy_lengths не пустой - в качестве адреса запроса 
> берется conf->vars.uri которое формируется из proxy url, а не из request url 
> и там всегда "/"
> если убрать проверку "if (plcf->proxy_lengths)" - запросы получаются 
> правильные 
> вот так
> /**********************************************************************************/
> -- nginx/src/http/modules/ngx_http_proxy_module.c      (original revision)
> +++ nginx/src/http/modules/ngx_http_proxy_module.c      (working copy)
> @@ -899,7 +899,7 @@
> 
>      ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
> 
> -    if (plcf->proxy_lengths) {
> +    if (0) {
>          uri_len = ctx->vars.uri.len;
> 
>      } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == 
> r->main)
> @@ -1005,14 +1005,14 @@
> 
>      u->uri.data = b->last;
> 
> -    if (plcf->proxy_lengths) {
> +    if (0) {
>          b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);
> 
>      } else if (unparsed_uri) {
>          b->last = ngx_copy(b->last, r->unparsed_uri.data, 
> r->unparsed_uri.len);
> 
>      } else {
> -        if (r->valid_location) {
> +        if (r->valid_location && plcf->proxy_lengths==NULL) { 
>              b->last = ngx_copy(b->last, ctx->vars.uri.data, 
> ctx->vars.uri.len);
>          }
> /**********************************************************************************/
> 
>  собственно вопрос - можно ли убрать проверку if (plcf->proxy_lengths)
>  и не зарезается ли при убирании какая-нибудь полезная функциональность nginx 
> ?

Это не ошибка, а фича. Нужно писать

    proxy_pass        http://$1.site.com$request_uri;

или, начиная с 0.8.25:

    proxy_pass        http://$1.site.com;


-- 
Игорь Сысоев
http://sysoev.ru

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.