mod_rewriteを使ったiPhone対応 (2008年07月12日)

iPhone用のサイトを作る際のTipsとして。

HTMLの書き方については色々なサイトで紹介されているので、
そちらを参照していただくとして、
iPhone用のページとPC用のページの振り分けについてなど、
弊社で運営している30min.の設定の一部を例として紹介させていただく。

GoogleAnalyticsなどでiPhoneのアクセスのみを集計したいため、
iPhoneとPC用のURLを分けたいが、トップページは同じURLにしたいので、
http://30min.jp/ にアクセスするとiPhoneは http://30min.jp/iphone/
以下にリダイレクトするようにした。

振り分けの設定はhttpd.conf内に記述することにした。
mod_rewriteを利用して次のような設定をしている。

    RewriteEngine On

    RewriteCond %{HTTP_USER_AGENT} ipod|iphone [NC]
    RewriteRule !^/(iphone|images|javascripts|stylesheets) http://30min.jp/iphone [R=301,L]

画像、JavaScript、CSSは共通のディレクトリを使用するが、
それ以外のページはHTTP_USER_AGENTにipod、iphone(大文字小文字を区別せず)
を含む場合は /iphone へリダイレクトするようにしている。

    RewriteCond %{HTTP_USER_AGENT} !(ipod|iphone) [NC]
    RewriteRule ^/iphone http://30min.jp/ [R=301,L]

逆にPCからの /iphone 以下へのアクセスはPC版のトップへリダイレクトさせている。

Ruby on Railsで開発している場合には、
負荷対策としてページキャッシュを使うことが多いと思う。

プログラム中にリダイレクトの処理を書く方法だと、
静的なページとして保存するページキャッシュが使えないのだが、
httpd.conf中に振り分けを記述してしまうことで、
Railsのページキャッシュを有効に活用することができるので便利だ。

mod_rewriteには他にも便利な使い方がある。
30min.ではエリアを選択した際、そのエリアをCookieに保存して、
次回トップページにアクセスする際には、
Cookieに保存されているエリアにリダイレクトするようにしている。
この設定も次のように記述できる。

    RewriteCond %{HTTP_COOKIE} c_default=town%3A(\d+) [NC]
    RewriteRule ^/$ http://30min.jp/town/%1/1 [R=301,L]

    RewriteCond %{HTTP_COOKIE} c_default=station%3A(\d+) [NC]
    RewriteRule ^/$ http://30min.jp/station/%1/1 [R=301,L]

Cookieがない場合のトップページはブラウザがキャッシュしてしまうと、
Cookieを持った後に以前のページを表示してしまうことがあるので、
トップページのテンプレート(rhtml)には次の記述を入れておく。

    <% if request.env["REQUEST_URI"] == "/" %>
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta http-equiv="Expires" content ="Thu, 01 Dec 1994 16:00:00 GMT" />
    <% end %>

便利な使い方ができるので、工夫して色々試してもらいたい。
苦労して振り分け処理をしている箇所など、
案外簡単に解決できたりすることがあったりする。