From: Graham Leggett Date: Thu, 1 Dec 2011 12:40:51 +0000 (+0000) Subject: mod_rewrite: Add the AllowNoSlash RewriteOption, which makes it possible X-Git-Tag: 2.5.0-alpha~7765 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36c25f8ffa86866c8ed630a173b76ea9a329fd87;p=thirdparty%2Fapache%2Fhttpd.git 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 --- diff --git a/docs/manual/mod/mod_rewrite.xml b/docs/manual/mod/mod_rewrite.xml index c12df7f3519..122d9ae7412 100644 --- a/docs/manual/mod/mod_rewrite.xml +++ b/docs/manual/mod/mod_rewrite.xml @@ -171,6 +171,21 @@ later Available in Apache HTTP Server 2.3.10 and later.

+
AllowNoSlash
+
+

By default, mod_rewrite will ignore URLs that map to a + directory on disk but lack a trailing slash, in the expectation that + the mod_dir module will issue the client with a redirect to + the canonical URL with a trailing slash.

+ +

When the DirectorySlash directive + is set to off, the AllowNoSlash 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.

+
+ diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 7d7e899eb40..470e01cdd31 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] == '/' &&