]> git.kaiwu.me - nginx.git/commitdiff
Fixed wrong URI after try_files in nested location (ticket #97).
authorMaxim Dounin <mdounin@mdounin.ru>
Sun, 16 Aug 2015 07:51:34 +0000 (10:51 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Sun, 16 Aug 2015 07:51:34 +0000 (10:51 +0300)
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.

src/http/ngx_http_core_module.c

index 9d502acf50beb0dc00bb3934e3efa3062811b58d..bfcd48b6bd6ccad1a799d4aea178e0ad5208487c 100644 (file)
@@ -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);