下記のような一行だけのルールだと、このルールが何度も適用されて無限ループになってしまうのに、
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)にマッチしたあとインターナルリダイレクトし、その後また一番最初からルールとのマッチングを行なっているのですが、これを回避するための条件というのは何なのでしょうか?
[L]フラグの挙動ではなく「リダイレクトした先でも新たに1からルールのマッチングが行われる」というmod_rewrite(含むapache)の挙動によるものなので、残念ながら「変えることのできない仕様(仕組み)」となります
対処としては「リダイレクトした先でも新たに1からルールのマッチングが行われることを意識して無限ループしないように組む」しかないです
・トラップあるいはゴールを仕込んで回避する
RewriteRule ^hoge - [L]
・曖昧な部分を減らして回避する
RewriteRule ^(.*\.html)$ hoge/$1 のように拡張子を用いて回避する
RewriteRule ^/hogehoge/(.*)$ hoge/$1 のようにディレクトリ構造も含めて回避する
返信への追記
>RewriteRule ^hoge - [L]
>このルールが、「ゴール」となるのはなぜですか?
次のような流れになります
ハイフン [L]
↓
そのままでどこにもリダイレクトしない。マッチング作業も終了する
↓
リダイレクトしないのだから、新たにルールのマッチングが行われることもない
解答ありがとうございます。
一点だけ追加で確認をさせてください。
RewriteRule ^hoge - [L]
このルールが、「ゴール」となるのはなぜですか? このルールにマッチしたあと、新たに1からルールとのマッチングが行われないのは、想像するに、置換先に指定されている "-" によるものかと思いますが、そういう理解であっていますか?