人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kurokumi
●カテゴリ:インターネット ウェブ制作
✍キーワード:.htaccess ABC HTML mod_rewrite ON
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● sera_yr
●60ポイント ベストアンサー

こんにちは。

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

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

◎質問者からの返答

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

理解できました。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ