When mod_rewrite is
triggered, it reads the configured rulesets from its configuration structure (which
itself was either created on startup for per-server context or during the directory walk
of the Apache kernel for per-directory context). Then the URL rewriting engine is started
with the contained ruleset (one or more rules together with their conditions). The
operation of the URL rewriting engine itself is exactly the same for both configuration
contexts. Only the final result processing is different.
The order of rules in the ruleset is important because the rewriting engine processes
them in a special (and not very obvious) order. The rule is this: The rewriting engine
loops through the ruleset rule by rule (RewriteRule
directives) and when a particular rule
matches it optionally loops through existing corresponding conditions
(RewriteCond
directives). For historical reasons the conditions are given
first, and so the control flow is a little bit long-winded.
The control flow through the rewriting ruleset
As you can see, first the URL is matched against the Pattern of each rule.
When it fails mod_rewrite immediately stops processing
this rule and continues with the next rule. If the Pattern matches, mod_rewrite looks for corresponding rule conditions. If none are
present, it just substitutes the URL with a new value which is constructed from the
string Substitution and goes on with its rule-looping. But if conditions exist,
it starts an inner loop for processing them in the order that they are listed. For
conditions the logic is different: we don't match a pattern against the current URL.
Instead we first create a string TestString by expanding variables,
back-references, map lookups, etc. and then we try to match CondPattern
against it. If the pattern doesn't match, the complete set of conditions and the
corresponding rule fails. If the pattern matches, then the next condition is processed
until no more conditions are available. If all conditions match, processing is continued
with the substitution of the URL with Substitution.
There are a lot of variables named TIME_xxx for
rewrite conditions.
RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^index\.php$ day.html
RewriteRule ^index\.php$
night.html
This provides the content of day.html under the URL index.php from 07:00-19:00 and at the remaining
time the contents of night.html.