ПРОЕКТЫ 


  АРХИВ 


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: nginx-0.7.1



Hello!

On Thu, May 29, 2008 at 01:17:56AM +0400, proforg wrote:

Игорь, видимо наткнулся на изменение поведения locations,
но понять в чём дело как то пока не могу.

[...]

Сломались все rewrite внутри вложенных location'ов (включая неявные, созданные с помощью if), которые должны были приводить к повторному поиску совпадения uri и location'а.

Воспроизводится в 0.7.1 вот на таком конфиге:

        location /blah {
            if ($args ~ "xxx") {
                rewrite . /click last;
            }
        }

        location /click {
            return 502;
        }

После срабатывания rewrite не происходит поиска нового location'а (точнее - происходит, но только по последнему уровню вложенности) и запрос остаётся в том же location'е что и был, в результате возвращается 404.

Прилагаемый патч проблему исправляет.

Maxim Dounin
# HG changeset patch
# User Maxim Dounin <mdounin@xxxxxxxxxx>
# Date 1212762229 -14400
# Node ID a4d059c8ab11979ea677bf35c9345e9ab5b71789
# Parent  9d9dad60269f80f69e83636f2324903e45b77152
Fix rewrite in nested locations.

Reset request's loc_conf to in ngx_http_core_find_config_phase() to default.
Without these ngx_http_core_find_location() will reuse old r->loc_conf and
will not be able to find correct location if request came from rewrite in
nested location (including implicit ones created by 'if').

diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -773,9 +773,14 @@ ngx_http_core_find_config_phase(ngx_http
     size_t                     len;
     ngx_int_t                  rc;
     ngx_http_core_loc_conf_t  *clcf;
+    ngx_http_core_srv_conf_t  *cscf;
 
     r->content_handler = NULL;
     r->uri_changed = 0;
+
+    cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
+
+    r->loc_conf = cscf->ctx->loc_conf;
 
     rc = ngx_http_core_find_location(r);
 


 




Copyright © Lexa Software, 1996-2009.