Edited at

アクセスされたブラウザ名をPHPで判別する方法

アクセスされたブラウザ名をPHPで判別するサンプルコードを以下に記します。

よりよい方法やバグ等ございましたら、アドバイスいただけると光栄です。


ブラウザを判別するには

PHPでブラウザ名を取得するには、ヘッダーに含まれるHTTP_USER_AGENTを取得し判別します。

実際に $_SERVER変数 の内容を確認してみましょう。

echo $_SERVER['HTTP_USER_AGENT'];

Firefoxを使用していた場合、以下のようなデータが取れます。

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0

「Firefox」という文字列があるので、それを使えば判定が出来そうです。

strstr関数 を使って判定してみます。

if (strstr($browser , 'Firefox')) {

echo('ご使用のブラウザはFirefoxです。');
}

これで、Firefoxを使用していることの判定は出来ました。

思ったより簡単そうです。


思わぬ落とし穴

しかし、何事もそう簡単にはいかないのが現実。

Chromeを使っていた場合のユーザーエージェントの文字列をご覧ください。

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36

「Chrome」という文字列があるので、それを使えば判定が出来そうです。

あれ。ちょっと待った。「Safari」って入ってる。

ちょっと危険な香りがしてきましたね。

続いて、Edgeを使っていた場合のユーザーエージェントの文字列をご覧ください。

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299

おい。「Chrome」も「Safari」も入ってるぞ。どうしてくれるんだ。

なんだかややこしくなってきました。

最後に、Safariを使っていた場合のユーザーエージェントの文字列をご覧ください。

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/8.0.8 Safari/600.8.9

今度は「Safari」だけかよ!!

といった具合に、一部のブラウザでは非常にややこしい感じになっているので、判定の順序に気を付けないと、本当はChromeを使っているのにSafariを使用していると誤判定したり、Edgeを使っているのにChromeを使用していると誤判定したりする恐れがあります。

なので、以下を踏まえた上でコードを組む必要があります。


① ChromeよりEdgeが先

② SafariよりChromeが先



サンプルコード

以上を踏まえた上で、以下のようなサンプルコードを作成しました。


UserAgentChecker.php


// 判定するのに小文字にする
$browser = strtolower($_SERVER['HTTP_USER_AGENT']);

// ユーザーエージェントの情報を基に判定
if (strstr($browser , 'edge')) {
echo('ご使用のブラウザはEdgeです。');
} elseif (strstr($browser , 'trident') || strstr($browser , 'msie')) {
echo('ご使用のブラウザはInternet Explorerです。');
} elseif (strstr($browser , 'chrome')) {
echo('ご使用のブラウザはGoogle Chromeです。');
} elseif (strstr($browser , 'firefox')) {
echo('ご使用のブラウザはFirefoxです。');
} elseif (strstr($browser , 'safari')) {
echo('ご使用のブラウザはSafariです。');
} elseif (strstr($browser , 'opera')) {
echo('ご使用のブラウザはOperaです。');
} else {
echo('知らん。');
}


しかし、これらの値はバージョンアップなどで予期せず変更される可能性があります。

実際にIEでは、IE11になってユーザーエージェントの文字列から「MSIE」が削除され「Trident」が追加されました。


Microsoft ユーザー エージェント文字列の変更


そのため、IEのところ見てもらえばわかる通り、識別子が2種類あります。

あくまで参考程度にご覧ください。


関連URL


UserAgentからOS/ブラウザなどの調べかたのまとめ

JavaScriptでUserAgentを使った判別をする

OS、ブラウザごとのCSSハックなどまとめ