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