@kyanny's blog

My life. Opinions are my own.

mod_rewrite の R フラグと L フラグについてメモ(R を省略できる場合)

自分自身が http://example.com/ だとして

RewriteRule ^/foo http://example.jp/ [L]

これは 302 Found でリダイレクトする。何気なく書いて、実際ちゃんと動いてて 302 Found なのも意図した通りで、でも「あれ? R つけてないけどいいんだっけ?」と疑問に思ってしまったので Apache module mod_rewrite を読み直した。

Substitution 部分が http:// スキームで始まり、かつそのホスト名/ポート番号が自分自身のものと一致しない場合は 302 でリダイレクトするものらしい。具体的に、そうである、という説明が書いてあったわけではないけど、 RewriteRule ディレクティブの解説の下のほうにある例の中に

^/somepath(.*) http://otherhost/otherpath$1     外部リダイレクション経由で
                                                http://otherhost/otherpath/pathinfo

^/somepath(.*) http://otherhost/otherpath$1 [R] 外部リダイレクション経由で
                                                http://otherhost/otherpath/pathinfo
                                                ([R] フラグは冗長)

というのがあった。 mod_rewrite 自身がリダイレクトを発生させてるわけじゃないけど結果としてリダイレクトするよ、ということで、 R フラグは冗長だからつけなくて良い、ということらしい。

・・・でも、やっぱ [R,L] と明示したほうがいいのかな、という気がしなくもないけど、まあどっちでもいいか。あと試してないけど、 [redirect,last] という風にキーワードを小文字で書いても良いみたい。これは(出来るのなら)こっちのほうがわかりやすい気がするな・・・。 RewriteRule は見た目があまりに呪文すぎて初学者に辛いと思う。