Index: docs/manual/mod/mod_rewrite.xml =================================================================== --- docs/manual/mod/mod_rewrite.xml (revision 1754984) +++ docs/manual/mod/mod_rewrite.xml (working copy) @@ -272,6 +272,25 @@ supply this extended context info. Available in 2.4.16 and later.

+ +
LegacyPrefixDocRoot
+
+ +

Prior to 2.4.24, if a substitution was an absolute URL that matched + the current virtual host, the URL might first be reduced to a URL-path + and then later reduced to a local path. Since the URL can be reduced + to a local path, the path should be prefixed with the document root. + This prevents a file such as /tmp/myfile from being accessed when a + request is made to http://host/file/myfile with the following + RewriteRule.

+ + RewriteRule /file/(.*) http://localhost/tmp/$1 + +

This option allows the old behavior to be used where the document + root is not prefixed to a local path that was reduced from a + URL. Available in 2.4.24 and later.

+
+ Index: modules/mappers/mod_rewrite.c =================================================================== --- modules/mappers/mod_rewrite.c (revision 1754984) +++ modules/mappers/mod_rewrite.c (working copy) @@ -202,6 +202,7 @@ #define OPTION_INHERIT_DOWN_BEFORE (1<<7) #define OPTION_IGNORE_INHERIT (1<<8) #define OPTION_IGNORE_CONTEXT_INFO (1<<9) +#define OPTION_LEGACY_PREFIX_DOCROOT (1<<10) #ifndef RAND_MAX #define RAND_MAX 32767 @@ -870,8 +871,15 @@ /* now check whether we could reduce it to a local path... */ if (ap_matches_request_vhost(r, host, port)) { + rewrite_server_conf *conf = + ap_get_module_config(r->server->module_config, &rewrite_module); rewritelog((r, 3, NULL, "reduce %s -> %s", r->filename, url)); r->filename = apr_pstrdup(r->pool, url); + + /* remember that the uri was reduced */ + if(!(conf->options & OPTION_LEGACY_PREFIX_DOCROOT)) { + apr_table_setn(r->notes, "mod_rewrite_uri_reduced", "true"); + } } } @@ -3026,6 +3034,9 @@ else if (!strcasecmp(w, "ignorecontextinfo")) { options |= OPTION_IGNORE_CONTEXT_INFO; } + else if (!strcasecmp(w, "legacyprefixdocroot")) { + options |= OPTION_LEGACY_PREFIX_DOCROOT; + } else { return apr_pstrcat(cmd->pool, "RewriteOptions: unknown option '", w, "'", NULL); @@ -4793,6 +4804,7 @@ } else { /* it was finally rewritten to a local path */ + const char *uri_reduced = NULL; /* expand "/~user" prefix */ #if APR_HAS_USER @@ -4828,7 +4840,12 @@ * because we only do stat() on the first directory * and this gets cached by the kernel for along time! */ - if (!prefix_stat(r->filename, r->pool)) { + + if(!(conf->options & OPTION_LEGACY_PREFIX_DOCROOT)) { + uri_reduced = apr_table_get(r->notes, "mod_rewrite_uri_reduced"); + } + + if (!prefix_stat(r->filename, r->pool) || uri_reduced != NULL) { int res; char *tmp = r->uri;