hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

.htaccessでのPC/携帯サイトの振り分けとアクセス制限

Apache.htaccessを使ってPCサイト/携帯サイトの振り分けを行う方法をまとめてみました。

ユーザーエージェントでの振り分け

携帯電話ブラウザからアクセスされた場合、ユーザーエージェントとして「DoCoMo」「KDDI」「SoftBank」などが含まれています。
これらの文字がユーザーエージェントに含まれている場合は「携帯電話からのアクセス」と見なすことでPC/携帯サイトの振り分けを行うことが出来ます。
ユーザーエージェントの判定には「HTTP_USER_AGENT」を使用します。

「HTTP_USER_AGENT」の判定と判定後のPC/携帯サイトそれぞれへの振り分けには、「mod_rewrite」を使用します。
mod_rewrite」を使用するためには、http.confまたは.htaccessでディレクトリに「Options +FollowSymLinks」を設定する必要があります。
 ※「Options +FollowSymLinks」を使用しない場合、「403 Forbidden」が発生してディレクトリ以下のページが見れなくなります。
ちなみに「Options +FollowSymLinks」は「指定したディレクトリについてシンボリックリンク先の参照を許可する」という意味になります。

###
# シンボリックリンク先の参照を許可 (mod_rewrite使用のために必要)
###
Options +FollowSymLinks

「HTTP_USER_AGENT」等の判定に使用する「RewriteCond」では正規表現を使用します。
「RewriteCond %{環境変数名} 正規表現」の形式で記述します。
「RewriteCond」は続けて記述すると「AND」の意味になります。
「OR」にしたい場合は、「RewriteCond %{環境変数名} 正規表現 [OR]」の形式で記述します。

「RewriteCond」の「OR」の例
###
# HTTP_USER_AGENTの先頭が「DoCoMo」または「KDDI」の場合
###
RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [OR] #[OR]を指定する
RewriteCond %{HTTP_USER_AGENT} ^KDDI
RewriteRule ^(.*)$ /mobile/ [R,L]
「RewriteCond」の「AND」の例
###
# REQUEST_URIの先頭が「/pc/」かつ
# HTTP_USER_AGENTの先頭が「SoftBank」の場合
###
RewriteCond %{REQUEST_URI} ^/pc/    #[OR]は指定しない
RewriteCond %{HTTP_USER_AGENT} ^SoftBank
RewriteRule ^(.*)$ /mobile/ [R,L]

「RewriteCond %{環境変数名} !(正規表現)」のように正規表現の前に「!」を付けると正規表現の否定の意味になります。

「RewriteCond」での正規表現否定の例
###
# HTTP_USER_AGENTの先頭が「DoCoMo」以外
###
RewriteCond %{HTTP_USER_AGENT} !(^DoCoMo)

###
# REQUEST_URIの先頭が「/mobile/」以外
###
RewriteCond %{REQUEST_URI} !(^/mobile/)

これまで説明した内容を使用した、PCサイト/携帯サイトの振り分け用の.htaccessです。

PCサイト/携帯サイトの振り分け用の.htaccess(例)
###
# シンボリックリンク先の参照を許可 (mod_rewrite使用のために必要)
###
Options +FollowSymLinks

###
# mod_rewriteを使用するために設定
###
RewriteEngine On

###
# /mobile ディレクトリ以外に携帯電話でアクセスされた場合、/mobile に転送させる
###
RewriteCond %{REQUEST_URI} !(^/mobile/)
RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank)
RewriteRule ^(.*)$ /mobile/ [R,L]

###
# /mobile ディレクトリに携帯電話以外(PCブラいざ)でアクセスされた場合、/pc に転送させる
###
RewriteCond %{REQUEST_URI} ^/mobile/
RewriteCond %{HTTP_USER_AGENT} !(^(DoCoMo|KDDI|DDIPOKET|UP\.Browser|J-PHONE|Vodafone|SoftBank))
RewriteRule ^(.*)$ /pc/ [R,L]

接続元IPアドレスでのアクセス制限

ユーザーエージェントはGoogleChromeFirefoxなどのアドオン(※1)を使用すれば簡単に偽装できるため、簡単に破られます。
※1:Firefoxの「user agent switcher」、GoogleCromeの「User-Agent Switcher for Chrome」など

それが嫌な場合には、接続元IPアドレスを判定しての振り分け(アクセス制限)が出来ます。

IPアドレスでのアクセス制限を設定する場合、まず「order deny,allow」で設定を「拒否→許可」の順番にします。

最初に「deny from all」ですべての接続元からのアクセスを拒否にします。
その後、「allow from 許可したい接続元IPアドレス」で接続を許可するIPアドレスを指定します。

接続元IPアドレスでのアクセス制限(例)
order deny,allow
deny from all

#docomo 2010/10/08
allow from 210.153.84.0/24
allow from 210.136.161.0/24

各携帯キャリアの接続元IPアドレス帯域の情報は下記のページから確認できます。

接続元IPアドレスを自分で設定するのは大変

「接続元IPアドレスって多いし、自分で設定するのが大変」という人には、携帯端末以外のIPを制限するhtaccessを自動で生成してくれるサービスがあります。
これを使えば簡単に.htaccessが作成できます。(便利な世の中ですねー)

携帯端末以外のIPを制限するhtaccessを簡単生成『Mobile IP htaccess Maker』- HTMLタグボード
http://www.dspt.net/tools/mobile_ip/

今回参考にしたページ

携帯サイトの振り分け方法 .htaccess編 - アイディアを5倍にする“浪速のWEBパフォーマー”KUMAの日記
http://sugoudemarketer.net/2009/04/htaccess.html

Blog N-two .htaccessでの携帯サイト振り分け方法
http://blog.n-two.jp/?eid=626802&target=comment

[mod_rewrite] RewriteEngine On にすると 403 Forbidden のエラーが発生する|雑記|php plus MySQL
http://php.birdlab.com/memo/16

携帯端末以外のIPを制限するhtaccessを簡単生成『Mobile IP htaccess Maker』- HTMLタグボード
http://www.dspt.net/tools/mobile_ip/