RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^abc.html$ rewrite1.php [L] #条件1
RewriteRule ^.*$ rewrite2.php [L] #条件1に一致しなかったときのみ評価したい
以上の記述の.htaccessがあるディレクトリへのWebからのアクセス
abc.htmlはrewrite1.phpではなく、rewrite2.phpが出力されます。
厳密には、条件1を実行して置換した後、さらに条件2で置換しているようです。
その証拠に条件2を変えた以下の条件2つで
RewriteRule ^abc.html$ rewrite1.php [L] #条件1はそのまま
RewriteRule ^rewrite1.php$ rewrite2.php [L] #条件2は変えた
abc.htmlへのアクセスが
abc.html→rewrite1.php→rewrite2.phpとなり、rewrite2.phpが
出力されます。
マニュアルには、[L]フラグは、
「ここで書き換え処理を中止し、それ以上の書き換えルールを適用しない」
とあります。
なのに、なぜこのような動作になるのかが理解できません。
こんにちは。
この場合の動作は次のようになります。
abc.htmlへアクセスしたときに、RewriteRule ^abc.html$ rewrite1.php [L]が適用され、書き換え処理がここで中止されて、rewrite1.phpへリダイレクトされます。
リダイレクトされるということは、rewrite1.phpへアクセスするということなので、今度はこのアクセスに対してRewriteRule ^.*$ rewrite2.php [L] が適用されてrewrite2.phpへリダイレクトされます。
ユーザーからするとアクセスは一度しかしていないつもりでも、サーバーにとっては2度アクセスされているということになるため、abc.htmlが最終的にはrewrite2.phpとなってしまうんです。
ということで、RewriteRuleは連続的に解釈されている訳ではなく、アクセスが2度されるので、その度に一つのRewriteRuleが適用されているわけです。