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