From 4ef49e127adaa2cc7f104e3ffa30143923292aa9 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Thu, 20 Feb 2014 18:08:31 +0000
Subject: [PATCH] *) mod_rewrite: Add RewriteOptions InheritDown,
InheritDownBefore, and IgnoreInherit to allow RewriteRules to be pushed
from parent scopes to child scopes without explicitly configuring each
child scope. PR56153.
Submitted By: Edward Lu
Committed By: covener
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1570288 13f79535-47bb-0310-9956-ffa450edef68
---
CHANGES | 5 +++++
docs/manual/mod/mod_rewrite.xml | 28 ++++++++++++++++++++++++++++
modules/mappers/mod_rewrite.c | 28 ++++++++++++++++++++++++----
3 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/CHANGES b/CHANGES
index d0bd9d540d..378571b2da 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,11 @@
-*- coding: utf-8 -*-
Changes with Apache 2.5.0
+ *) mod_rewrite: Add RewriteOptions InheritDown, InheritDownBefore,
+ and IgnoreInherit to allow RewriteRules to be pushed from parent scopes
+ to child scopes without explicitly configuring each child scope.
+ PR56153. [Edward Lu ]
+
*) mod_lua: Add r:wspeek for checking if there is any data waiting on the line
[Daniel Gruno]
diff --git a/docs/manual/mod/mod_rewrite.xml b/docs/manual/mod/mod_rewrite.xml
index 8e1b508021..7cc68cdf75 100644
--- a/docs/manual/mod/mod_rewrite.xml
+++ b/docs/manual/mod/mod_rewrite.xml
@@ -171,6 +171,34 @@ URLs on the fly
Available in Apache HTTP Server 2.3.10 and later.
+ InheritDown
+
+
+ If this option is enabled, all child configurations will inherit
+ the configuration of the current configuration. It is equivalent to
+ specifying RewriteOptions Inherit
in all child
+ configurations. See the Inherit
option for more details
+ on how the parent-child relationships are handled. Available in Apache
+ HTTP Server 2.4.8 and later.
+
+
+ InheritDownBefore
+
+
+ Like InheritDown
above, but the rules from the current
+ scope are applied before rules specified in any child's
+ scope. Available in Apache HTTP Server 2.4.8 and later.
+
+
+ IgnoreInherit
+
+
+ This option forces the current and child configurations to ignore
+ all rules that would be inherited from a parent specifying
+ InheritDown
or InheritDownBefore
. Available
+ in Apache HTTP Server 2.4.8 and later.
+
+
AllowNoSlash
By default, mod_rewrite will ignore URLs that map to a
diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c
index 17e6f22aca..c11a16c463 100644
--- a/modules/mappers/mod_rewrite.c
+++ b/modules/mappers/mod_rewrite.c
@@ -196,6 +196,9 @@ static const char* really_last_key = "rewrite_really_last";
#define OPTION_NOSLASH 1<<3
#define OPTION_ANYURI 1<<4
#define OPTION_MERGEBASE 1<<5
+#define OPTION_INHERIT_DOWN 1<<6
+#define OPTION_INHERIT_DOWN_BEFORE 1<<7
+#define OPTION_IGNORE_INHERIT 1<<8
#ifndef RAND_MAX
#define RAND_MAX 32767
@@ -2769,7 +2772,9 @@ static void *config_server_merge(apr_pool_t *p, void *basev, void *overridesv)
a->server = overrides->server;
- if (a->options & OPTION_INHERIT) {
+ if (a->options & OPTION_INHERIT ||
+ (base->options & OPTION_INHERIT_DOWN &&
+ !(a->options & OPTION_IGNORE_INHERIT))) {
/*
* local directives override
* and anything else is inherited
@@ -2781,7 +2786,9 @@ static void *config_server_merge(apr_pool_t *p, void *basev, void *overridesv)
a->rewriterules = apr_array_append(p, overrides->rewriterules,
base->rewriterules);
}
- else if (a->options & OPTION_INHERIT_BEFORE) {
+ else if (a->options & OPTION_INHERIT_BEFORE ||
+ (base->options & OPTION_INHERIT_DOWN_BEFORE &&
+ !(a->options & OPTION_IGNORE_INHERIT))) {
/*
* local directives override
* and anything else is inherited (preserving order)
@@ -2858,13 +2865,17 @@ static void *config_perdir_merge(apr_pool_t *p, void *basev, void *overridesv)
a->directory = overrides->directory;
- if (a->options & OPTION_INHERIT) {
+ if (a->options & OPTION_INHERIT ||
+ (base->options & OPTION_INHERIT_DOWN &&
+ !(a->options & OPTION_IGNORE_INHERIT))) {
a->rewriteconds = apr_array_append(p, overrides->rewriteconds,
base->rewriteconds);
a->rewriterules = apr_array_append(p, overrides->rewriterules,
base->rewriterules);
}
- else if (a->options & OPTION_INHERIT_BEFORE) {
+ else if (a->options & OPTION_INHERIT_BEFORE ||
+ (base->options & OPTION_INHERIT_DOWN_BEFORE &&
+ !(a->options & OPTION_IGNORE_INHERIT))) {
a->rewriteconds = apr_array_append(p, base->rewriteconds,
overrides->rewriteconds);
a->rewriterules = apr_array_append(p, base->rewriterules,
@@ -2916,6 +2927,15 @@ static const char *cmd_rewriteoptions(cmd_parms *cmd,
else if (!strcasecmp(w, "inheritbefore")) {
options |= OPTION_INHERIT_BEFORE;
}
+ else if (!strcasecmp(w, "inheritdown")) {
+ options |= OPTION_INHERIT_DOWN;
+ }
+ else if(!strcasecmp(w, "inheritdownbefore")) {
+ options |= OPTION_INHERIT_DOWN_BEFORE;
+ }
+ else if (!strcasecmp(w, "ignoreinherit")) {
+ options |= OPTION_IGNORE_INHERIT;
+ }
else if (!strcasecmp(w, "allownoslash")) {
options |= OPTION_NOSLASH;
}
--
2.50.1