On 20 Jan 2023, at 3:05 pm, Richard Walker <richard.wal...@ardc.edu.au> wrote:
> In mod_rewrite.html (https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html),
> the section "Per-directory Rewrites" includes these notes with example:
> 
> ==========
> • By default, mod_rewrite overrides rules when merging sections belonging to 
> the same context. The RewriteOptions directive can change this behavior, for 
> example using the Inherit setting.
> 
> • The RewriteOptions also regulates the behavior of sections that are stated 
> at the same nesting level of the configuration. In the following example, by 
> default only the RewriteRules stated in the second If block are considered, 
> since the first ones are overridden. Using RewriteOptions Inherit forces 
> mod_rewrite to merge the two sections and consider both set of statements, 
> rather than only the last one.
> 
> <If "true">
>  # Without RewriteOptions Inherit, this rule is overridden by the next
>  # section and no redirect will happen for URIs containing 'foo'
>  RewriteRule foo http://example.com/foo [R]
> </If>
> <If "true">
>  RewriteRule bar http://example.com/bar [R]
> </If>
> ==========
> 
> ...
> Question: in the example, despite the wording "stated at the same
> nesting level of the configuration", are the two <If> sections supposed to be
> embedded in _separate_ (.htaccess or <Directory>) contexts, rather
> than being immediately adjacent?
> 
> The text seems rather to imply that the description/example is supposed to be 
> as it is,
> but then the behaviour described is somewhat "counter-intuitive", i.e., I 
> don't see how
> I could have deduced it from the descriptions of RewriteOptions and <If>.
> The description of RewriteOptions Inherit at
> https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriteoptions
> does explicitly mention the case of per-directory context, and then
> only talks about merging rules from the _parent_ context, not from
> _sibling_ contexts.

OK, I've now done what I should already have done: I tested
the example to see how it behaves. I was able to test using 2.4.54.

I created a directory, created .htaccess within it and inserted the
example configuration preceded by "RewriteEngine On", and then accessed
the two URLs ending in .../foo and .../bar.

I confirm that with the example as given, the URL ending .../foo
gives a 404, and the URL .../bar gives the 302 rewrite correctly.

Sanity check #1: I changed the flags to "[R,L]": no change in behaviour.

Sanity check #2: I swapped the order of the two
<If> sections; I confirm that it is indeed "second one wins".

Sanity check #3: I restored the two <If> sections to the original order,
and copy/pasted the RewriteRule from the body of the first <If> into
the body of the second. Now both URLs perform the rewrite correctly.

I then restored the two <If> sections to the original content, and then
put a copy of the whole first <If> section after the second. (So, foo, then bar,
then foo again.) I confirm that it is indeed "last one wins".

So far, so consistent with the comment "Without RewriteOptions Inherit,
this rule is overridden by the next section".

_However_: I then restored the content of .htaccess to the initial setup,
and inserted "RewriteOptions Inherit" between
"RewriteEngine On" and the first <If> section, and repeated
the initial test. There is _no_ change in behaviour!

And then I repeated the test using "RewriteOptions InheritBefore".
Again, no change in behaviour.

So: it seems that the comment "Without RewriteOptions Inherit,
this rule is overridden by the next section" isn't quite right:
it seems rather to be the case that "_With or without_ RewriteOptions Inherit,
this rule is overridden by the next section" ....

Richard.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org
For additional commands, e-mail: users-h...@httpd.apache.org

Reply via email to