mod_rewriteについて、条件に一致したら、それ以降の条件を無視する方法がわかりません。


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]フラグは、
「ここで書き換え処理を中止し、それ以上の書き換えルールを適用しない」
とあります。
なのに、なぜこのような動作になるのかが理解できません。

回答の条件
  • 1人3回まで
  • 登録:2006/05/12 18:00:21
  • 終了:2006/05/17 12:32:12

ベストアンサー

id:sera_yr No.1

sera_yr回答回数123ベストアンサー獲得回数62006/05/12 21:22:25

ポイント60pt

こんにちは。

この場合の動作は次のようになります。

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が適用されているわけです。

id:kurokumi

なるほど、そうなっていたんですね。

理解できました。

ありがとうございました。

2006/05/17 12:31:28

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません