mod_rewriteの[L]フラグの挙動がよくわかりません。


下記のような一行だけのルールだと、このルールが何度も適用されて無限ループになってしまうのに、
RewriteRule ^(.*)$ hoge/$1 [L]

下記のようなルールを定義すれば無限ループにならないというのは、一般的にいうと[L]フラグのどういう振る舞いによるものですか?
RewriteRule ^hoge - [L]
RewriteRule ^(.*)$ hoge/$1

すこし視点を変えて、もうひとつ、

RewriteRule (RuleA) [L]
RewriteRule (RuleB) [L]
RewriteRule (RuleC) [L]
というルール定義で、入力URLが(RuleB)にマッチしたとき、(RuleB)には[L]フラグが指定されているので、マッチングはそこで終了、(RuleC)とのマッチングは行なわれない、というのはわかるのですが、
mod_rewiteのログを見ていると、(RuleB)にマッチしたあとインターナルリダイレクトし、その後また一番最初からルールとのマッチングを行なっているのですが、これを回避するための条件というのは何なのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/20 20:33:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント200pt

[L]フラグの挙動ではなく「リダイレクトした先でも新たに1からルールのマッチングが行われる」というmod_rewrite(含むapache)の挙動によるものなので、残念ながら「変えることのできない仕様(仕組み)」となります

  

対処としては「リダイレクトした先でも新たに1からルールのマッチングが行われることを意識して無限ループしないように組む」しかないです

 

・トラップあるいはゴールを仕込んで回避する

  RewriteRule ^hoge - [L]

 

・曖昧な部分を減らして回避する

  RewriteRule ^(.*\.html)$ hoge/$1 のように拡張子を用いて回避する

  RewriteRule ^/hogehoge/(.*)$ hoge/$1 のようにディレクトリ構造も含めて回避する

 

返信への追記

>RewriteRule ^hoge - [L]

>このルールが、「ゴール」となるのはなぜですか?

次のような流れになります

ハイフン [L]

  ↓

そのままでどこにもリダイレクトしない。マッチング作業も終了する

  ↓

リダイレクトしないのだから、新たにルールのマッチングが行われることもない

id:xfan

解答ありがとうございます。

一点だけ追加で確認をさせてください。

RewriteRule ^hoge - [L]

このルールが、「ゴール」となるのはなぜですか? このルールにマッチしたあと、新たに1からルールとのマッチングが行われないのは、想像するに、置換先に指定されている "-" によるものかと思いますが、そういう理解であっていますか?

2011/06/20 20:09:33

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

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

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

回答リクエストを送信したユーザーはいません