2011年9月24日土曜日

RewriteCondが効かずに困った

言わずと知れた、apacheのmod_rewriteエンジンですがRewriteCondとRewriteRuleの記述方法にはまってしまいました。普通の書き方は他に任せるとしてハマったポイントを書いておきます。

■RewriteCondは直後のRewriteRuleのみに適用される。
RewriteEngine On
RewriteCond %{HTTP_REFERER} $^ …①
RewriteRule ^/foo/(.*) /foo2/$1 [L] …②
RewriteRule ^/bar/(.*) /bar2/$1 [L] …③
上記の様な設定の時に①は、②にも③にも効きそうですが、実際には②にしか効きません。
だからリファラーがあっても、barはbar2にリダイレクトしてしまいます。

③にも効かせるには、(冗長ですが)下記の様に書く必要があります。

RewriteEngine On
RewriteCond %{HTTP_REFERER} $^
RewriteRule ^/foo/(.*) /foo2/$1 [L]
RewriteCond %{HTTP_REFERER} $^   # 同じ記載をする!
RewriteRule ^/bar/(.*) /bar2/$1 [L]

■RewriteCondはRewriteRuleの後に評価される。

RewriteEngine On
RewriteCond %{HTTP_REFERER} $^
RewriteRule ^/foo/(.*) /foo2/$1 [L]

上記の設定の場合「リファラーが空なら、リクエストが/foo/*の場合、/foo2/*へリダイレクトと思いたい所ですが、実際には「リクエストが/foo/*の場合、リファラーが空なら、/foo2/*へリダイレクト」という処理の流れになります。

「何でRewriteLogLevelを上げて見てみても、RewriteCond実行されてない!効いてないんちゃうか?」って時はこれが原因の可能性が高いです。

5 件のコメント:

  1. 私も同じ問題にハマっていました。助かりました、ありがとう!

    返信削除
    返信
    1. apacheのconfは少し癖がありますよねw
      お役に立てて何よりです。

      削除
  2. ううう。私も助かりました。5,6時間延々と設定しては再起動繰り返してました。
    ありがとうございました。

    返信削除
  3. [L]を取っちゃえばいいんじゃないかな?

    返信削除
  4. RewirteCond効かないで検索したらマジ助かりました。

    返信削除