CGIぽん
モバイルCGI研究(総合編)
2002年3月11日更新

端末判別法


目次


はじめに

PC や各ケータイ端末、 L-mode で異なる処理をしたいときに必要になるのが端末判別。 User Agent を使う方法が一般的ですが、他にもいくつかの方法が考えられるので紹介します。

各ケータイ端末の環境変数を詳しく知りたい場合は「モバイルCGI研究(総合編)環境変数リファレンス」をご参照下さい。


User Agent を使った方法

User Agent はアクセスしてきたブラウザの情報で、環境変数 "HTTP_USER_AGENT" に格納されています。各ケータイ端末、L-modeの User Agent のフォーマットは以下のようになっています。

ドットi の場合
ASTEL/HTTPバージョン/機種名(バージョン)/1ページあたりの容量/対応メロディ
例)ASTEL/1.0/J-0511.00/c10/smel
EZweb 旧端末 の場合
UP.Browser/ブラウザバージョン-デバイスID UP.Link/UP.Linkサーババージョン
例)UP.Browser/3.04-SN13 UP.Link/3.3.0.5
EZweb WAP2.0 対応端末の場合
KDDI-デバイスID UP.Browser/ブラウザバージョン サーバ名
例) KDDI-HI21 UP.Browser/6.0.2.254(GUI) MMP/1.1
H" の場合
PDXGW/HTTPバージョン (端末表示能力)
例)PDXGW/1.0 (TX=8;TY=7;GX=96;GY=84;C=C256;G=BF;GI=2)
i-mode ( FOMA 以外) 、ブラウザフォン の場合
DoCoMo/1.0/機種名/キャッシュサイズ/個体識別情報
例)DoCoMo/1.0/SO503i/c10
FOMA の場合
DoCoMo/2.0 機種名 (キャッシュサイズ;個体識別情報)
例)DoCoMo/2.0 P2101V(c100)
J-SKY の場合
J-PHONE/ブラウザバージョン/機種名(バージョン)
例)J-PHONE/2.0/J-SH02
L-modeの場合
L-mode//HTTPバージョン////
例)L-mode//1.0////

よって、次のようなスクリプトが考えられます。

Perl
# User Agent によるキャリア判別
# 2002.03.11更新

@user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($user_agent[0] eq 'ASTEL') {
  # ドットi 用の処理
} elsif ($user_agent[0] eq 'UP.Browser') {
  # EZweb 旧端末用の処理
} elsif ($user_agent[0] =~ /^KDDI/) {
  # EZweb WAP2.0 対応端末用の処理
} elsif ($user_agent[0] eq 'PDXGW') {
  # H" 用の処理
} elsif ($user_agent[0] eq 'DoCoMo') {
  # i-mode 用の処理
} elsif ($user_agent[0] eq 'J-PHONE') {
  # J-SKY 用の処理
} elsif ($user_agent[0] eq 'L-mode') {
  # L-mode 用の処理
} else {
  # それ以外
}
PHP
// User Agent によるキャリア判別
// 2002.03.11更新

global $HTTP_USER_AGENT;
$ua = explode("/",$HTTP_USER_AGENT);
if ($ua[0] == 'ASTEL') {
  // ドットi 用の処理
} elseif ($ua[0] == 'UP.Browser') {
  // EZweb 旧端末用の処理
} elseif (ereg("^KDDI","$ua[0]")) {
  // EZweb WAP2.0 対応端末用の処理
} elseif ($ua[0] == 'PDXGW') {
  // H" 用の処理
} elseif ($ua[0] == 'DoCoMo') {
  // i-mode 用の処理
} elseif ($ua[0] == 'J-PHONE') {
  // J-SKY 用の処理
} elseif ($ua[0] == 'L-mode') {
  // L-mode 用の処理
} else {
  // それ以外
}

ただし、この方法ですと、例えば "DoCoMo/〜" と名乗るブラウザは、パソコン上で動かすシミュレータなども含めて全て i-mode と判断されてしまいます。もちろんパソコン上で動作確認をするときなどには便利なのですが、反面、ケータイ用ページのソースを見せたくない場合やリンク先の URL を秘密にしたい場合などには困った状況になります。

そこで考えられるのが、次の Remote Host を使った方法です。


Remote Host を使った方法

ケータイ端末は、たいがい各社のサーバを経由してインターネットに接続されますので、そのサーバ情報を格納している環境変数 "REMOTE_HOST" を調べることによって、該当するケータイ端末かどうかを判別することができます。

Perl
# Remote Host によるキャリア判別
# 2002.03.11更新

if ($ENV{'REMOTE_HOST'} =~ /\.(ezweb|ido)\.ne\.jp$/) {
  # EZweb 用の処理
  if ($ENV{'HTTP_USER_AGENT'} =~ /^KDDI/) {
    # EZweb WAP2.0 端末用の処理
  } else {
    # EZweb 旧端末用の処理
  }
} elsif ($ENV{'REMOTE_HOST'} eq 'pdxcgw.pdx.ne.jp') {
  # H" 用の処理
} elsif ($ENV{'REMOTE_HOST'} =~ /\.docomo\.ne\.jp$/) {
  # i-mode 用の処理
} elsif ($ENV{'REMOTE_HOST'} =~ /\.jp-[ckqt]\.ne\.jp$/) {
  # J-SKY 用の処理
} elsif ($ENV{'REMOTE_HOST'} =~ /\.pipopa\.ne\.jp$/) {
  # L-mode 用の処理
} else {
  # それ以外
}
PHP
// Remote Host によるキャリア判別
// 2002.03.11更新

global $REMOTE_HOST;
global $HTTP_USER_AGENT;
if (ereg("\.(ido|ezweb)\.ne\.jp$",$REMOTE_HOST)) {
  if (ereg("^KDDI",$HTTP_USER_AGENT)) {
    // EZweb WAP2.0 端末用の処理
  } else {
    // EZweb 旧端末用の処理
  }
} elseif ($REMOTE_HOST == 'pdxcgw.pdx.ne.jp') {
  // H" 用の処理
} elseif (ereg("\.docomo\.ne\.jp$",$REMOTE_HOST)) {
  // i-mode 用の処理
} elseif (ereg("\.jp-[ckqt]\.ne\.jp$",$REMOTE_HOST)) {
  // J-SKY 用の処理
} elseif (ereg("\.pipopa\.ne\.jp$",$REMOTE_HOST)) {
  // L-mode 用の処理
} else {
  // それ以外
}

この方法の問題点の1つは、ドット i 及び DoCoMo のブラウザフォン(PHS)を判別できないことです。ブラウザフォンはたいがい mopera.ne.jp を経由してくるようですが、それが全てではありません。

もう一つの問題点は、他のサーバを経由してアクセスしてきた場合にケータイ端末だと判別されないことです。近頃はパケット代を節約するために、不要なタグを削除してくれるサービスなどがありますが、これらはケータイ各社の専用サーバとホームページの間に立って、データを変換してくれています。この場合、 Remote Host は経由サーバのものになりますので注意が必要です。

J-SKY のサーバはもっとある、という指摘をいただくことがありますが、おそらくそれはメールサーバのことで、 J-SKY ウェブのサービスに関わるサーバは "jp-c"、"jp-k"、"jp-q"、"jp-t" の4つで良さそうです。


その他の方法

これ以外に、各ケータイ端末特有の環境変数を利用する方法があります。

例えば J-SKY 端末の場合は、 "HTTP_X_JPHONE_COLOR" 、 "HTTP_X_JPHONE_DISPLAY" 、 "HTTP_X_JPHONE_MSNAME" 、 "HTTP_X_JPHONE_SMAF" 、 "HTTP_X_JPHONE_SOUND" 等の独自の環境変数があります。

ただし、全ての端末にこれらの情報が含まれるという確証がないこと(現に、 "HTTP_X_JPHONE_SMAF" は一部の端末では格納されていないことがわかっています)、また、 User Agent 同様、パソコン上のシミュレータをはじくことができないのが難点です。


関連リンク

次のサイトが参考になります。

公式サイト
ドットi 対応 HTML 仕様
EZweb on the street
オープンネットコンテンツ
i-mode 対応 HTML の考え方
J-SKY ウェブ
CGIぽん
モバイルCGI研究(総合編)環境変数リファレンス
モバイルCGI研究(EZweb編)端末情報一覧
モバイルCGI研究(H"編)端末情報一覧
モバイルCGI研究(i-mode編)端末情報一覧

このページの履歴

2002.03.11
EZweb WAP2.0 対応端末に関する記述を追加。
サンプルスクリプトの PHP 版を追加。
2001.09.05
L-mode に関する記述を追加。
2001.06.18
J-SKY の User Agent を間違えて記述していたのを訂正。
2000.06.09
初版。

CGIぽんはINFOJAMの安価で快適なサーバを利用しています。