diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2015-08-16 10:51:34 +0300 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2015-08-16 10:51:34 +0300 |
commit | df30660f4daee72e3e44018a2830c83c5c531def (patch) | |
tree | d347d150ae61407a007b6a2dde46ed2361544f80 | |
parent | f178835bfa2f59c59186c9ffa967d412df7f2339 (diff) | |
download | nginx-df30660f4daee72e3e44018a2830c83c5c531def.tar.gz |
Fixed wrong URI after try_files in nested location (ticket #97).
The following configuration with alias, nested location and try_files
resulted in wrong file being used. Request "/foo/test.gif" tried to
use "/tmp//foo/test.gif" instead of "/tmp/test.gif":
location /foo/ {
alias /tmp/;
location ~ gif {
try_files $uri =405;
}
}
Additionally, rev. c985d90a8d1f introduced a regression if
the "/tmp//foo/test.gif" file was found (ticket #768). Resulting URI
was set to "gif?/foo/test.gif", as the code used clcf->name of current
location ("location ~ gif") instead of parent one ("location /foo/").
Fix is to use r->uri instead of clcf->name in all cases in the
ngx_http_core_try_files_phase() function. It is expected to be
already matched and identical to the clcf->name of the right
location.
-rw-r--r-- | src/http/ngx_http_core_module.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c index 9d502acf5..bfcd48b6b 100644 --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c @@ -1273,7 +1273,7 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r, *e.pos = '\0'; if (alias && alias != NGX_MAX_SIZE_T_VALUE - && ngx_strncmp(name, clcf->name.data, alias) == 0) + && ngx_strncmp(name, r->uri.data, alias) == 0) { ngx_memmove(name, name + alias, len - alias); path.len -= alias; @@ -1357,6 +1357,8 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r, } } else { + name = r->uri.data; + r->uri.len = alias + path.len; r->uri.data = ngx_pnalloc(r->pool, r->uri.len); if (r->uri.data == NULL) { @@ -1364,8 +1366,8 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r, return NGX_OK; } - p = ngx_copy(r->uri.data, clcf->name.data, alias); - ngx_memcpy(p, name, path.len); + p = ngx_copy(r->uri.data, name, alias); + ngx_memcpy(p, path.data, path.len); } ngx_http_set_exten(r); |