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] == '/' &&