]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_alias: When an alias is declared inside a Location, make sure
authorGraham Leggett <minfrin@apache.org>
Fri, 14 Apr 2023 14:07:49 +0000 (14:07 +0000)
committerGraham Leggett <minfrin@apache.org>
Fri, 14 Apr 2023 14:07:49 +0000 (14:07 +0000)
the balance of the URL is preserved to match the alias declared
outside a location. Fixes an error where all requests are mapped
to the root of the location.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1909137 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/mappers/mod_alias.c

diff --git a/CHANGES b/CHANGES
index 22f958ab9f60c40f5fae74df6b033fd0880ed5a1..5776d4a06f0a3a8285f4dbbe76d915a728665878 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,11 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.1
 
+  *) mod_alias: When an alias is declared inside a Location, make sure
+     the balance of the URL is preserved to match the alias declared
+     outside a location. Fixes an error where all requests are mapped
+     to the root of the location. [Graham Leggett]
+
   *) core: Be explicit if an enclosing directive contains a path or a
      regex. [Graham Leggett]
 
index e652d3c100bda16da7477e3dce1bc03af7efe7b6..b1638a34e4226bd73825c5d71368e6bd0814feaa 100644 (file)
@@ -59,6 +59,7 @@ typedef struct {
     unsigned int redirect_set:1;
     apr_array_header_t *redirects;
     const ap_expr_info_t *alias;
+    const char *alias_fake;
     char *handler;
     const ap_expr_info_t *redirect;
     int redirect_status;                /* 301, 302, 303, 410, etc */
@@ -113,6 +114,7 @@ static void *merge_alias_dir_config(apr_pool_t *p, void *basev, void *overridesv
     a->redirects = apr_array_append(p, overrides->redirects, base->redirects);
 
     a->alias = (overrides->alias_set == 0) ? base->alias : overrides->alias;
+    a->alias_fake = (overrides->alias_set == 0) ? base->alias_fake : overrides->alias_fake;
     a->handler = (overrides->alias_set == 0) ? base->handler : overrides->handler;
     a->alias_set = overrides->alias_set || base->alias_set;
 
@@ -220,6 +222,9 @@ static const char *add_alias(cmd_parms *cmd, void *dummy, const char *fake,
                     NULL);
         }
 
+        if (!cmd->regex) {
+            dirconf->alias_fake = cmd->path;
+        }
         dirconf->handler = cmd->info;
         dirconf->alias_set = 1;
 
@@ -438,6 +443,17 @@ static char *try_alias(request_rec *r)
             return PREGSUB_ERROR;
         }
 
+        if (dirconf->alias_fake) {
+            int l;
+
+            l = alias_matches(r->uri, dirconf->alias_fake);
+
+            if (l > 0) {
+                ap_set_context_info(r, dirconf->alias_fake, found);
+                found = apr_pstrcat(r->pool, found, r->uri + l, NULL);
+            }
+        }
+
         if (dirconf->handler) { /* Set handler, and leave a note for mod_cgi */
             r->handler = dirconf->handler;
             apr_table_setn(r->notes, "alias-forced-type", r->handler);