apache - Why is this [L] flag failing to prevent application of the next rewrite rule? -
i thought "l" flag supposed prevent subsequent rules being applied. yet in example:
rewriterule foo bar [l] rewriterule bar qux
i http://mysite/foo
rewritten http://mysite/qux
. expected http://mysite/bar
. missing here?
the behavior of [l]
flag quite poorly described in apache docs. in order understand how works first need know how apache handles rewriterules. let's take simple example
rewriterule ^something /somethingelse #1 rewriterule ^somewhere /somewhereelse #2 rewriterule ^someplace /anotherplace #3
in situation multiple rules , no [l]
flags, if request /something
, apache rewrite /somethingelse
(as per #1), try rules #2 , #3. after rules processed checks if url came out of rewriterules same url went in. if it's not, apache starts processing rules again, until input===output (or maximum number of redirects met, prevent infinite loops).
now, if change rule #1 , add [l]
it, , request /something
again, apache rewrite /somethingelse
(as per #1), , stop processing rules, i.e., not process #2 , #3. then, since url came out not same url went in (that's crux here), processing restarts, , rules #2 , #3 processed anyway (and #1 also, doesn't anymore).
in example if want prevent /bar
being redirected /qux
when rewritten first rewriterule, can use
rewriterule foo bar [l] rewritecond %{the_request} ^get\ /bar rewriterule bar qux
that rewrite /bar
/qux
only if user requested /bar
, , not if url rewritten /foo
/bar
first.
the trick here %{the_request}
contains exact http header used request, , doesn't change when rewrite url, using variable can check original request (in contrast %{request_uri}
, change on every rewrite).
Comments
Post a Comment