あるウェブサービスのユーザが、
「どういう環境でサービスを利用しているか」
を判別する厳密な方法は存在しない。
...しないのだけれど、
ユーザの環境に合せてサービスを変更しないと
マズいシチュエーションも多々存在し (OSやBrowserのバグのため)、
そういう場合はUser-Agent を調べてサーバサイドの処理を変えていくことになる。
User-Agent の解釈は正規表現で行うことが多い(と思う)けれど、
PHP の場合はメンテナンスされたbrowscap を利用することで、
かなり厳密にユーザの環境を特定できる。
(...というのを、つい最近知った。
あと、他の言語のことを知らないだけでbrowscap 自体は汎用的なものかも)
browscap : http://browsers.garykeith.com/downloads.asp から取得可能
(?? 現在アクセス不可)
; @php.ini
browscap = /PATH/TO/BROWSCAP
のような設定をした上で、
<?php
// $sample = $_SERVER['HTTP_USER_AGENT'];
$sample = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7";$browser = get_browser($sample, true);
var_dump($browser);
?>
みたいなソースを実行すると、
$ php browscap.php
array(26) {
["browser_name_regex"]=>
string(68) "^mozilla/5\.0 (windows; .; windows nt 5\.1; .*; rv:1\.8.*) gecko/.*$"
["browser_name_pattern"]=>
string(60) "Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/*"
["parent"]=>
string(11) "Mozilla 1.8"
["platform"]=>
string(5) "WinXP"
["browser"]=>
string(7) "Mozilla"
["version"]=>
string(3) "1.8"
["majorver"]=>
string(1) "1"
["minorver"]=>
string(1) "8"
["css"]=>
string(1) "2"
["frames"]=>
string(1) "1"
["iframes"]=>
string(1) "1"
["tables"]=>
string(1) "1"
["cookies"]=>
string(1) "1"
["backgroundsounds"]=>
string(0) ""
["vbscript"]=>
string(0) ""
["javascript"]=>
string(1) "1"
["javaapplets"]=>
string(1) "1"
["activexcontrols"]=>
string(0) ""
["cdf"]=>
string(0) ""
["aol"]=>
string(0) ""
["beta"]=>
string(1) "1"
["win16"]=>
string(0) ""
["crawler"]=>
string(0) ""
["stripper"]=>
string(0) ""
["wap"]=>
string(0) ""
["netclr"]=>
string(0) ""
}
というような結果が返る。
ここから、各々の環境を調べるのが最も誤差がない方法に思える。

そんな関数あったんですね。
全然知りませんでした。crawler避けとかにも使えそうですね。
> crawler避けとかにも使えそう
ウェブに転がっているbrowscap.ini を見た感じだと、
かなりマニアックなcrawler のUser-Agent情報も書かれてるっぽいので、
確かにそういう用途でもいけそうっすね。
なるほどー。
すごい。DoCoMoとかKDDIとかもはいってるのね。いいかも。
むしろ海外の携帯っぽいUser-Agentが全然わかんないっす...