
携帯電話端末等をそれぞれに最適なページへ振り分けする為のPHPスクリプトです。
もちろんPCも振り分けられます。ASTEL,L-MODE,H"-LINK,PS2/PS3/PSP,Wii等も別ページへ振り分けます。
さらに、機種名やデバイスIDを設定することで機種別に振り分けることも可能となっています。
バージョンアップによりこの機能は廃止されました。
このスクリプトの特徴はIPアドレスにより携帯電話からのアクセスであるか判定出来る点にあります。
※現在一定の動作確認を終了しましたがバグがある可能性もあります。高いセキュリティが必要な公式サイトなどでの使用はご遠慮頂いた方が賢明かと存じます。
書こう書こうと思って今になってしまったのですが、このスクリプトを使われる方は高木浩光@自宅の日記 – 無責任なキャリア様に群がるIDクレクレ乞食 ―― 退化してゆく日本のWeb開発者を一読しておく事をおすすめします。
2010-05-24 こういったスクリプトを公開しておきながらいうのも何なのですが、IPアドレス帯域を使用して振り分けすること自体愚策だったんだなと今は考えています。
参考:高木浩光@自宅の日記 – まだまだ他でも破綻しているケータイID認証
認証に個体識別番号を使っているような場合は突破される可能性があるようです。ただ単純にそれぞれのキャリアに最適化した表示がされるようにしているだけなら実害はないと思いますが、それならばユーザーエージェントだけ見れば十分という事になると思います。
このスクリプトを導入するだけで携帯端末への対応に頭を悩ませることがなくなります。
ダウンロード後は解凍ソフトで解凍後divide.phpを開き初期設定部分を編集して下さい。
<?php
#初期設定#####################################################################################
/*
リモートホストによる判定を利用するか
WILLCOMの端末でユーザーエージェントを変更出来るものでユーザーエージェントをOpera等に設定
している場合、たとえClubAirEDGE経由でもPC扱いとなります。
使用する : TRUE
使用しない : FALSE
*/
$rh = TRUE;
//NTT DoCoMo:i-mode端末向けURL
$im = 'http://www.ezinfo.jp/spec/docomo/';
//SoftBank:Yahoo!ケータイ(Vodafone-Live)端末向けURL
$yk = 'http://www.ezinfo.jp/spec/vodafone/';
//au:EZWeb端末向けURL
$ez = 'http://www.ezinfo.jp/spec/au/';
//WILLCOM:AIR-EDGE PHONE端末向けURL
$ae = 'http://www.ezinfo.jp/spec/willcom/';
//PC向けURL
$pc = 'http://www.ezinfo.jp/';
//その他携帯端末等向け簡易ページURL(L-MODE,ASTEL,H"LINK,PS2/PS3/PSP,Wii)
$ot = 'http://board.ezinfo.jp/';
#ここまで#####################################################################################
$obj = new MobileCheck();
$env = $obj->CheckUA($_SERVER['HTTP_USER_AGENT']);
if($env !== 'pc' && $env !== 'other' && $rh === TRUE){
$obj->GetZone($env);
$result = $obj->CheckIP($obj->zone);
if($result === FALSE){
// 偽装の時はPCへ振り分け
$env = 'pc';
}
}
switch($env){
// アクセス数の多い順に並べる
case "au":
header('Location: '.$ez);
break;
case "docomo":
header('Location: '.$im);
break;
case "softbank":
header('Location: '.$yk);
break;
case "willcom":
header('Location: '.$ae);
break;
case "other":
header('Location: '.$ot);
break;
case "pc":
header('Location: '.$pc);
break;
default:
header('Location: '.$pc);
}
exit;
class MobileCheck{
var $zone;
function GetZone($env){
/* IP帯域の設定 */
if($env === 'docomo'){
//i-mode(NTT DoCoMo)のIPアドレス帯域を設定
//更新日時:2007-03-22
//http://www.nttdocomo.co.jp/service/imode/make/content/ip/index.html
$this->zone[0] = '210.153.84.0/24';
$this->zone[1] = '210.136.161.0/24';
$this->zone[2] = '210.153.86.0/24';
}elseif($env === 'au'){
//EZWeb(au)のIPアドレス帯域を設定
//更新日時:2007-03-23
//http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
$this->zone[0] = '210.169.40.0/24';
$this->zone[1] = '210.196.3.192/26';
$this->zone[2] = '210.196.5.192/26';
$this->zone[3] = '210.230.128.0/24';
$this->zone[4] = '210.230.141.192/26';
$this->zone[5] = '210.234.105.32/29';
$this->zone[6] = '210.234.108.64/26';
$this->zone[7] = '210.251.1.192/26';
$this->zone[8] = '210.251.2.0/27';
$this->zone[9] = '211.5.1.0/24';
$this->zone[10] = '211.5.2.128/25';
$this->zone[11] = '211.5.7.0/24';
$this->zone[12] = '218.222.1.0/24';
$this->zone[13] = '61.117.0.0/24';
$this->zone[14] = '61.117.1.0/24';
$this->zone[15] = '61.117.2.0/26';
$this->zone[16] = '61.202.3.0/24';
$this->zone[17] = '219.108.158.0/26';
$this->zone[18] = '219.125.148.0/24';
$this->zone[19] = '222.5.63.0/24';
$this->zone[20] = '222.7.56.0/24';
$this->zone[21] = '222.5.62.128/25';
$this->zone[22] = '222.7.57.0/24';
$this->zone[23] = '59.135.38.128/25';
$this->zone[24] = '219.108.157.0/25';
$this->zone[25] = '219.125.151.128/25';
}elseif($env === 'softbank'){
//Yahoo!ケータイ(SoftBank)のIPアドレス帯域を設定
//更新日時:2007-03-23
//http://developers.softbankmobile.co.jp/dp/tech_svc/web/ip.php
$this->zone[0] = '202.179.204.0/24';
$this->zone[1] = '202.253.96.248/29';
$this->zone[2] = '210.146.7.192/26';
$this->zone[3] = '210.146.60.192/26';
$this->zone[4] = '210.151.9.128/26';
$this->zone[5] = '210.169.130.112/29';
$this->zone[6] = '210.169.130.120/29';
$this->zone[7] = '210.169.176.0/24';
$this->zone[8] = '210.175.1.128/25';
$this->zone[9] = '210.228.189.0/24';
$this->zone[10] = '211.8.159.128/25';
}elseif($env === 'willcom'){
//AIR-EDGE PHONE(WILLCOM)のIPアドレス帯域を設定
//更新日時:2007-05-12
//http://www.willcom-inc.com/ja/service/contents_service/club_air_edge/for_phone/ip/
$this->zone[0] = '61.198.142.0/24';
$this->zone[1] = '219.108.14.0/24';
$this->zone[2] = '61.198.161.0/24';
$this->zone[3] = '219.108.0.0/24';
$this->zone[4] = '61.198.249.0/24';
$this->zone[5] = '219.108.1.0/24';
$this->zone[6] = '61.198.250.0/24';
$this->zone[7] = '219.108.2.0/24';
$this->zone[8] = '61.198.253.0/24';
$this->zone[9] = '219.108.3.0/24';
$this->zone[10] = '61.198.254.0/24';
$this->zone[11] = '219.108.4.0/24';
$this->zone[12] = '61.198.255.0/24';
$this->zone[13] = '219.108.5.0/24';
$this->zone[14] = '61.204.3.0/25';
$this->zone[15] = '219.108.6.0/24';
$this->zone[16] = '61.204.4.0/24';
$this->zone[17] = '221.119.0.0/24';
$this->zone[18] = '61.204.6.0/25';
$this->zone[19] = '221.119.1.0/24';
$this->zone[20] = '125.28.4.0/24';
$this->zone[21] = '221.119.2.0/24';
$this->zone[22] = '125.28.5.0/24';
$this->zone[23] = '221.119.3.0/24';
$this->zone[24] = '125.28.6.0/24';
$this->zone[25] = '221.119.4.0/24';
$this->zone[26] = '125.28.7.0/24';
$this->zone[27] = '221.119.5.0/24';
$this->zone[28] = '125.28.8.0/24';
$this->zone[29] = '221.119.6.0/24';
$this->zone[30] = '211.18.235.0/24';
$this->zone[31] = '221.119.7.0/24';
$this->zone[32] = '211.18.238.0/24';
$this->zone[33] = '221.119.8.0/24';
$this->zone[34] = '211.18.239.0/24';
$this->zone[35] = '221.119.9.0/24';
$this->zone[36] = '125.28.11.0/24';
$this->zone[37] = '125.28.13.0/24';
$this->zone[38] = '125.28.12.0/24';
$this->zone[39] = '125.28.14.0/24';
$this->zone[40] = '125.28.2.0/24';
$this->zone[41] = '125.28.3.0/24';
$this->zone[42] = '211.18.232.0/24';
$this->zone[43] = '211.18.233.0/24';
$this->zone[44] = '211.18.236.0/24';
$this->zone[45] = '211.18.237.0/24';
$this->zone[46] = '125.28.0.0/24';
$this->zone[47] = '125.28.1.0/24';
$this->zone[48] = '61.204.0.0/24';
$this->zone[49] = '210.168.246.0/24';
$this->zone[50] = '210.168.247.0/24';
$this->zone[51] = '219.108.7.0/24';
$this->zone[52] = '61.204.2.0/24';
$this->zone[53] = '61.204.5.0/24';
$this->zone[54] = '61.198.129.0/24';
$this->zone[55] = '61.198.140.0/24';
$this->zone[56] = '61.198.141.0/24';
$this->zone[57] = '125.28.15.0/24';
$this->zone[58] = '61.198.165.0/24';
$this->zone[59] = '61.198.166.0/24';
$this->zone[60] = '61.198.168.0/24';
$this->zone[61] = '61.198.169.0/24';
$this->zone[62] = '61.198.170.0/24';
$this->zone[63] = '61.198.248.0/24';
$this->zone[64] = '125.28.16.0/24';
$this->zone[65] = '125.28.17.0/24';
$this->zone[66] = '211.18.234.0/24';
$this->zone[67] = '219.108.8.0/24';
$this->zone[68] = '219.108.9.0/24';
$this->zone[69] = '219.108.10.0/24';
$this->zone[70] = '61.198.138.100/32';
$this->zone[71] = '61.198.138.101/32';
$this->zone[72] = '61.198.138.102/32';
}
}//func-GetZone
function CheckUA($agent){
/* UserAgentからキャリアを返す */
if(strpos($agent,"DoCoMo") !== FALSE){
return('docomo');
}elseif(strpos($agent,"SoftBank") !== FALSE || strpos($agent,"Vodafone") !== FALSE || strpos($agent,"J-PHONE") !== FALSE || strpos($agent,"MOT-") !== FALSE){
return('softbank');
}elseif(strpos($agent,"KDDI-") !== FALSE || strpos($agent,"UP.Browser/") !== FALSE){
return('au');
}elseif(strpos($agent,"WILLCOM") !== FALSE || strpos($agent,"DDIPOCKET") !== FALSE){
return('willcom');
}elseif(strpos($agent,"L-MODE") !== FALSE || strpos($agent,"Nintendo Wii;") !== FALSE || strpos($agent,"PlayStation Portable") !== FALSE || strpos($agent,"EGBROWSER") !== FALSE || strpos($agent,"AveFront") !== FALSE || strpos($agent,"PLAYSTATION 3;") !== FALSE || strpos($agent,"ASTEL") !== FALSE || strpos($agent,"PDXGW") !== FALSE){
return('other');
}else{
return('pc');
}
}//func-CheckUA
function CheckIP($area){
/* IPアドレス帯域($zone)に含まれているか検査 */
$addr = $_SERVER['REMOTE_ADDR'];
$i = 0;
$count = count($area);
$flag = FALSE;
while($i < $count){
/* ネットワークアドレスの算出 */
//範囲の特定
list($ip,$sub) = explode('/',$area[$i]);
list($mask,$plus) = $this->switchtomask($sub);
if($mask === FALSE && $plus === FALSE) die('範囲がおかしいです(0-32まで)');
//IP,サブネットマスクの論理積を求める
$ip = explode('.',$ip);
$mask = explode('.',$mask);
//それぞれの論理積を求める
$network[0] = bindec(decbin($ip[0]) & decbin($mask[0]));
$network[1] = bindec(decbin($ip[1]) & decbin($mask[1]));
$network[2] = bindec(decbin($ip[2]) & decbin($mask[2]));
$network[3] = bindec(decbin($ip[3]) & decbin($mask[3]));
//ロングIPアドレスへ
$naddr = sprintf("%u", ip2long(implode('.',$network)));
$baddr = $naddr + $plus -1;
/* $addrが範囲内にあるか */
//$addrをロングIPアドレス化する
$addr = sprintf("%u", ip2long($addr));
if($naddr < $addr && $addr < $baddr){
$flag = TRUE;
break;
}
$i++;
}
return $flag;
}//func-CheckIP
/* xxx.xxx.xxx.xxx/YYのYY→yyy.yyy.yyy.yyyへ */
function switchtomask($sub){
switch($sub){
case 32 :
$mask = '255.255.255.255';
$plus = 1;
break;
case 31 :
$mask = '255.255.255.254';
$plus = 2;
break;
case 30 :
$mask = '255.255.255.252';
$plus = 4;
break;
case 29 :
$mask = '255.255.255.248';
$plus = 8;
break;
case 28 :
$mask = '255.255.255.240';
$plus = 16;
break;
case 27 :
$mask = '255.255.255.224';
$plus = 32;
break;
case 26 :
$mask = '255.255.255.192';
$plus = 64;
break;
case 25 :
$mask = '255.255.255.128';
$plus = 128;
break;
case 24 :
$mask = '255.255.255.0';
$plus = 256;
break;
case 23 :
$mask = '255.255.254.0';
$plus = 512;
break;
case 22 :
$mask = '255.255.252.0';
$plus = 1024;
break;
case 21 :
$mask = '255.255.248.0';
$plus = 2048;
break;
case 20 :
$mask = '255.255.240.0';
$plus = 4096;
break;
case 19 :
$mask = '255.255.224.0';
$plus = 8192;
break;
case 18 :
$mask = '255.255.192.0';
$plus = 16384;
break;
case 17 :
$mask = '255.255.128.0';
$plus = 32768;
break;
case 16 :
$mask = '255.255.0.0';
$plus = 65536;
break;
case 15 :
$mask = '255.254.0.0';
$plus = 131072;
break;
case 14 :
$mask = '255.252.0.0';
$plus = 262144;
break;
case 13 :
$mask = '255.248.0.0';
$plus = 524288;
break;
case 12 :
$mask = '255.240.0.0';
$plus = 1048576;
break;
case 11 :
$mask = '255.224.0.0';
$plus = 2097152;
break;
case 10 :
$mask = '255.192.0.0';
$plus = 4194304;
break;
case 9 :
$mask = '255.128.0.0';
$plus = 8388608;
break;
case 8 :
$mask = '255.0.0.0';
$plus = 16777216;
break;
case 7 :
$mask = '254.0.0.0';
$plus = 33554432;
break;
case 6 :
$mask = '252.0.0.0';
$plus = 67108864;
break;
case 5 :
$mask = '248.0.0.0';
$plus = 134217728;
break;
case 4 :
$mask = '240.0.0.0';
$plus = 268435456;
break;
case 3 :
$mask = '224.0.0.0';
$plus = 536870912;
break;
case 2 :
$mask = '192.0.0.0';
$plus = 1073741824;
break;
case 1 :
$mask = '128.0.0.0';
$plus = 2147483648;
break;
case 0 :
$mask = '0.0.0.0';
$plus = 4294967296;
break;
default :
$mask = FALSE;
$plus = FALSE;
break;
}
return array($mask,$plus);
}//func-switchtomask
}//class-MobileCheck
?>
うまく動作しない場合があるなど動作報告は大歓迎です。