diff options
author | Graham Leggett <minfrin@apache.org> | 2011-12-01 13:40:51 +0100 |
---|---|---|
committer | Graham Leggett <minfrin@apache.org> | 2011-12-01 13:40:51 +0100 |
commit | 36c25f8ffa86866c8ed630a173b76ea9a329fd87 (patch) | |
tree | bd8cd31d20275dd46606f768a63c5f4712c2abb9 | |
parent | Wish came true: CacheEnable works within LocationMatch, giving us mod_cache (diff) | |
download | apache2-36c25f8ffa86866c8ed630a173b76ea9a329fd87.tar.xz apache2-36c25f8ffa86866c8ed630a173b76ea9a329fd87.zip |
mod_rewrite: Add the AllowNoSlash RewriteOption, which makes it possible
for RewriteRules to be placed in .htaccess files that match the directory
with no trailing slash. PR 48304.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1209053 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | docs/manual/mod/mod_rewrite.xml | 15 | ||||
-rw-r--r-- | modules/mappers/mod_rewrite.c | 9 |
2 files changed, 22 insertions, 2 deletions
diff --git a/docs/manual/mod/mod_rewrite.xml b/docs/manual/mod/mod_rewrite.xml index c12df7f351..122d9ae741 100644 --- a/docs/manual/mod/mod_rewrite.xml +++ b/docs/manual/mod/mod_rewrite.xml @@ -171,6 +171,21 @@ later</compatibility> Available in Apache HTTP Server 2.3.10 and later.</p> </dd> + <dt><code>AllowNoSlash</code></dt> + <dd> + <p>By default, <module>mod_rewrite</module> will ignore URLs that map to a + directory on disk but lack a trailing slash, in the expectation that + the <module>mod_dir</module> module will issue the client with a redirect to + the canonical URL with a trailing slash.</p> + + <p>When the <directive module="mod_dir">DirectorySlash</directive> directive + is set to off, the <code>AllowNoSlash</code> option can be enabled to ensure + that rewrite rules are no longer ignored. This option makes it possible to + apply rewrite rules within .htaccess files that match the directory without + a trailing slash, if so desired. Available in Apache HTTP Server 2.4.0 and + later.</p> + </dd> + </dl> </usage> diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 7d7e899eb4..470e01cdd3 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -189,6 +189,7 @@ static const char* really_last_key = "rewrite_really_last"; #define OPTION_NONE 1<<0 #define OPTION_INHERIT 1<<1 #define OPTION_INHERIT_BEFORE 1<<2 +#define OPTION_NOSLASH 1<<3 #ifndef RAND_MAX #define RAND_MAX 32767 @@ -2882,6 +2883,9 @@ static const char *cmd_rewriteoptions(cmd_parms *cmd, else if (!strcasecmp(w, "inheritbefore")) { options |= OPTION_INHERIT_BEFORE; } + else if (!strcasecmp(w, "allownoslash")) { + options |= OPTION_NOSLASH; + } else if (!strncasecmp(w, "MaxRedirects=", 13)) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, "RewriteOptions: MaxRedirects option has been " @@ -4698,9 +4702,10 @@ static int hook_fixup(request_rec *r) /* * .htaccess file is called before really entering the directory, i.e.: * URL: http://localhost/foo and .htaccess is located in foo directory - * Ignore such attempts, since they may lead to undefined behaviour. + * Ignore such attempts, allowing mod_dir to direct the client to the + * canonical URL. This can be controlled with the AllowNoSlash option. */ - if (!is_proxyreq) { + if (!is_proxyreq && !(dconf->options & OPTION_NOSLASH)) { l = strlen(dconf->directory) - 1; if (r->filename && strlen(r->filename) == l && (dconf->directory)[l] == '/' && |