【mod_rewrite】「.htaccess」でのLフラグは意味がない?
「.htaccess」での設定時の注意点にあるように、「.htaccess」で以下の設定を行ったとします。
RewriteEngine On
RewriteRule ^index.html index2.html
RewriteRule ^index3.html index4.html
RewriteRule ^index2.html index3.html
この場合、「http://○○○.com/index.html」でアクセスした場合、「index3.html」ではなく、「index4.html」が出力されます。
これは、「.htaccess」でのmod_rewriteでは、マッチングが終了してもまた最初から戻ってマッチングしていく・・・という仕様があるからです(詳しくは上記ページ参照)。
スポンサードリンク
Lフラグを指定すればいいかも!
RewriteRuleにLフラグを指定すれば、その時点で書き換え処理は終了するはずだ!と考えました。
Lフラグ:マッチングした場合、URL書き換え処理を中止するフラグ(それ以降の書き換えはしない)
ということで、先ほどのmod_rewriteをこのようにしました。
RewriteEngine On
RewriteRule ^index.html index2.html [L]
RewriteRule ^index3.html index4.html [L]
RewriteRule ^index2.html index3.html [L]
しかしLフラグを付けても、マッチング→書き換え処理中止とはならず、Lフラグを付けても付けなくても同じ挙動になりました。
htppd.confにLフラグを記述
mod_rewriteを設定するファイルはもっぱら.htaccessを利用しているのですが、Lフラグの役割を確認するため、「httpd.conf」ファイル(Directoryセクション外)に記述してみました(詳しくは「httpd.conf」での設定方法を参照)。
RewriteEngine On
RewriteRule ^/index.html index2.html [L]
RewriteRule ^/index3.html index4.html [L]
RewriteRule ^/index2.html index3.html [L]
このとき、「http://○○○.com/index.html」でアクセスしたら、「index4.html」ではなく「index2.html」が出力されました。
つまり、マッチング→それ以降の書き換えは行わない、というLフラグの役割が正常に働いていることが確認できました。
結論
ということで、私の拙い&数の少ない検証の結果、「.htaccess」ファイルにLフラグを指定しても意味がないという結論になりました(「httpd.conf」では有効)。
やはり「.htaccess」でのmod_rewriteでは、マッチングが終了してもまた最初から戻ってマッチングしていくという仕様の方が優先されるようです。
この原因はmod_rewriteのログを追っていけば解明できるかもしれませんが、いったんは打ち切り。時間があるときにでも確認したいと思います。
Warning: count(): Parameter must be an array or an object that implements Countable in /home/yskymk/www/000web/ysklog/mod-rewrite/wp-includes/class-wp-comment-query.php on line 405
コメント
まだコメントはありません。