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