mod_rewriteでつまづいたのでメモ。

携帯アクセスの時だけ別ディレクトリに飛ばしたくて以下のように書いたんですが、どうもうまく動かない。

RewriteCond %{HTTP_USER_AGENT} DoCoMo [OR]
RewriteCond %{HTTP_USER_AGENT} J-PHONE [OR]
RewriteCond %{HTTP_USER_AGENT} Vodafone [OR]
RewriteCond %{HTTP_USER_AGENT} SoftBank [OR]
RewriteCond %{HTTP_USER_AGENT} WILLCOM [OR]
RewriteCond %{HTTP_USER_AGENT} DDIPOCKET [OR]
RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteRule ^$ http://なんとか/m/ [R]

何がおかしいんだろうと思って見てみたら、wordpressから吐き出された以下のコードが邪魔していました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

このルールが携帯のルールよりも前に書いてあればいいんですが、携帯ルールを先に書いてしまうと不具合が起こります。
まず先に携帯ルールに沿って http://なんとか/m/index.php に飛ばされますが、その後wordpressルールによってindex.phpというファイルへのアクセスは全てベースディレクトリ下のindex.phpへと飛ばされます。
つまり、http://なんとか/m/index.php に飛ばしてたつもりがwordpressルールのせいで http://なんとか/index.php になってしまっていたということです。
wordpressルールを先に書けば、携帯ルール適用後に飛ばされることが無くなるのでこの問題は解決します。