nginx-0.7.1

Maxim Dounin mdounin at mdounin.ru
Fri Jun 6 18:26:02 MSD 2008


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
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# 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);
 


More information about the nginx-ru mailing list