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

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)にマッチしたあとインターナルリダイレクトし、その後また一番最初からルールとのマッチングを行なっているのですが、これを回避するための条件というのは何なのでしょうか?

●質問者: xfan
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:hoge mod_rewrite URL ひとつ もの
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
●200ポイント ベストアンサー

[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からルールとのマッチングが行われないのは、想像するに、置換先に指定されている "-" によるものかと思いますが、そういう理解であっていますか?

関連質問


●質問をもっと探す●



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