GeekFactory

int128.hatenablog.com

携帯からのアクセスをリダイレクトする

User-Agentに応じてコンテンツの内容を変えるにはmod_rewriteが便利です。ただし、書き方を気を付けないと可読性が低くメンテしにくい設定になってしまいます。

普通に書くとこんな感じです。User-Agentパターンは実際はかなりあります。

RewriteCond %{HTTP_USER_AGENT} DoCoMo [OR]
RewriteCond %{HTTP_USER_AGENT} SoftBank [OR]
RewriteCond %{HTTP_USER_AGENT} Vodafone [OR]
RewriteCond %{HTTP_USER_AGENT} KDDI
RewriteRule ^.*$ http://example.com/m/ [R,L]

ここで、リダイレクトはトップページだけに限定してみます。最近はテレビにもWebブラウザが搭載されていますので、テレビ向けコンテンツも用意します。

RewriteCond %{HTTP_USER_AGENT} DoCoMo [OR]
RewriteCond %{HTTP_USER_AGENT} SoftBank [OR]
RewriteCond %{HTTP_USER_AGENT} Vodafone [OR]
RewriteCond %{HTTP_USER_AGENT} KDDI
RewriteRule ^/$ http://example.com/m/ [R,L]

RewriteCond %{HTTP_USER_AGENT} InettvBrowser
RewriteRule ^/$ http://example.com/tv/ [R,L]

さらに、携帯やテレビ向けのコンテンツはUser-Agentを限定する要件があったりすると、設定はすぐにカオス化します。

そこで、BrowserMatchとRewriteCondを組み合わせると設定がすっきりします。BrowserMatchは上から順に評価されるので、どれにも該当しない場合の条件が非常に書きやすくなります。

BrowserMatch ".*" ua=pc

BrowserMatch "DoCoMo" ua=mobile
BrowserMatch "SoftBank" ua=mobile
BrowserMatch "Vodafone" ua=mobile
BrowserMatch "KDDI" ua=mobile

BrowserMatch "InettvBrowser" ua=tv

RewriteCond %{ENV:ua} mobile
RewriteRule ^/$ http://example.com/m/ [R,L]

RewriteCond %{ENV:ua} pc
RewriteRule ^/tv$ http://example.com/ [R,L]

複雑な要件がある場合はBrowserMatchやSetEnvIfがおすすめです。RewriteCondのみに比べると文字列検索の回数が増えてしまうので、パフォーマンスの影響を測定したいですね。

ちなみに、User-Agentを変えながらの試験はJMeterスクリプトを書いておくと楽です。テスト駆動構築は精神衛生上よろしい。