iPhoneやスマートフォンからのアクセスをphpで判定する

よくスマートフォンでアクセスしてきた場合にページの表示が変わるものがありますよね。
その処理をphpで実行するためにはどうしたらいいか。
答えはとても単純で環境変数でユーザーエージェント(User Agent)を取得して判定するだけです。
今回はその判定方法と実際の処理などを考えてみたいと思います。

phpで環境変数を取得するためには$_ENVという変数にアクセスします。
今回はユーザーエージェントを取得するので$_ENV[“HTTP_USER_AGENT”]です。

<?php
	$user_agent = $_ENV&#91;"HTTP_USER_AGENT"&#93;;
	echo $user_agent;
?>

これでアクセスしたブラウザの情報やOSなどの情報が表示されます。

では、iPhoneからのアクセスを振り分けてみたいと思います。

<?php
	$user_agent = $_ENV&#91;"HTTP_USER_AGENT"&#93;;
	if(stripos($user_agent,'iPhone') !== false) echo "iPhoneからのアクセスです。";
	echo $user_agent;
?>

stripos()は「大文字小文字を区別せずに文字列が最初に現れる位置を探す」ための関数です。
大文字小文字を区別するstrpos()でも良いのですが、念のためです。
これは指定した文字列が含まれている場合に0以上の整数を返すので、if文で判定することができます。(if文では1以上はtrueと判断するため。)
2014/01/19 追記:※文字列の出てくる位置を評価するため0以上の整数が返されます。存在しない場合はfalseを返すので、falseでないかを判定します。

iPhoneだけでなく、Androidも判定することができます。

<?php
	$user_agent = $_ENV&#91;"HTTP_USER_AGENT"&#93;;
	if(stripos($user_agent,'Android') !== false) echo "Androidからのアクセスです。";
	echo $user_agent;
?>

これを応用して、URL転送するためのHeader関数のLocationと組み合わせてみます。

<?php
	$user_agent = $_ENV&#91;"HTTP_USER_AGENT"&#93;;
	if(stripos($user_agent,'Android') !== false || stripos($user_agent,'iPhone') !== false){
		//Android、iPhoneからのアクセス
		//SmartPhone用サイトへ転送
		header('Location: http://www.example.com/sp/');
	}else{
		echo "スマートフォンからのアクセスではありません。";
	}
?>

cakePHPではLayoutを切り替えることにより簡単にスマートフォン用サイトを表示できます。

<?php
	$user_agent = $_ENV&#91;"HTTP_USER_AGENT"&#93;;
	if(stripos($user_agent,'Android') !== false || stripos($user_agent,'iPhone') !== false){
		//Android、iPhoneからのアクセス
		//SmartPhone用Layoutへ切り替え
		$this->layout = "smartphone_layout";
	}
?>

また、おまけですが同じ方法で携帯も判別できます。
ドコモは「DoCoMo」、ソフトバンク・ボーダフォン・J-フォンはそれぞれ「SoftBank」「Vodafone」「J-PHONE」、auはよくわからないのですが「UP.Browser」らしいです。

    • 匿名
    • 2014 01/15 4:56pm

    ダウト
    >これは指定した文字列が含まれている場合に1以上の整数を返すので
    strpos(~) !== FALSE

      • yu29ozaki
      • 2014 01/19 12:27am

      そのとおりでございます。確認不足で申し訳ないです。僕も普段strposあるいはstriposを使用する際は型評価まで行っています。
      ===で型・値の一致、!==で型or値の不一致を判定できます。
      本文の該当箇所は修正済みです。

  1. トラックバック 0

return top