PHPでUser-Agent Client Hints(UA-CH)を利用したユーザーのデバイスを判別する方法



PHPでユーザーが利用しているデバイスを判別して処理を切り分ける場合は、スーパーグローバル変数を利用して情報を取得して処理をします。

これまでの方法としては、「$_SERVER[‘HTTP_USER_AGENT’]」を使ってユーザーエージェントの情報を取得し、PCであればWindowsやMac、モバイル端末であればMobileまたはAndroidやiPhone、iPadいった文字を含む情報を取得してから、対象の文字が含まれているかで判別を行なっていました。(iPadOS13以降のSafariでは、MobileやiPadの文字が含まれず、MacのPCと同じ情報が返ってきます)

$ua = $_SERVER['HTTP_USER_AGENT']


しかし、これまでのユーザーエージェントの取得方法については、サーバサイドスクリプトのJavaScriptのuserAgentもそうですが、廃止の方向で話が進んでいますので、PHPの$_SERVER[‘HTTP_USER_AGENT’]も廃止となる可能性があります。
そして今後は、User-Agent Client HintsのAPI情報を利用していく流れに変わりつつあります。

ここでは、PHPでのユーザーのデバイス判別を、これまでのHTTP_USER_AGENTとUser-Agent Client Hintsとどちらにも対応した方法でご紹介します。

User-Agent Client Hintsの利用


PHP8からは、以下のようなUser-Agent Client Hintsに関連する変数が利用できます。
返す値は以下の内容になります。

$_SERVER[‘HTTP_SEC_CH_UA’]
ブラウザの種類とバージョン情報を返す
例) “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Google Chrome”;v=”122″
$_SERVER[‘HTTP_SEC_CH_UA_MOBILE’]
モバイルの判定に必要な値を返す
〔戻り値〕
 モバイルの場合:?1
 PCの場合:?0
$_SERVER[‘HTTP_SEC_CH_UA_PLATFORM’]
Windows、macOS、Androidなど、OSの種類を返す



実際に取得できる情報を確認してみます。
以下、確認用のサンプルコードになります。

User-Agent Client Hints(確認用)

<?php
$ua_ch = $_SERVER['HTTP_SEC_CH_UA'];
$ua_ch_mobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'];
$ua_ch_platform = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'];
echo 'UA-CH: ' . $ua_ch . '<br>';
echo 'Mobile:  ' . $ua_ch_mobile . '<br>';
echo 'Device: ' . $ua_ch_platform . '<br>';
?>



上記のプログラムをPCはMacとWindows、モバイルではAndroid端末で確認してみますと、以下のような情報が返ってきます。

Mac(Google Chrome)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Google Chrome”;v=”122″
Mobile: ?0
Device: “macOS”

Windows(Microsoft Edge)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Microsoft Edge”;v=”122″
Mobile: ?0
Device: “Windows”

Android(Google Chrome)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Google Chrome”;v=”122″
Mobile: ?1
Device: “Android”

Android(Microsoft Edge)
UA-CH: “Chromium”;v=”122″, “Not(A:Brand”;v=”24″, “Microsoft Edge”;v=”122″
Mobile: ?1
Device: “Android”



お使いのサーバでUser-Agent Client Hints関連の変数が利用できるかは、print_r関数を使って変数の詳細を確認されるといいでしょう。

<?php print_r($_SERVER); ?>



ここでは、デバイスの判別方法のお話ですので、mobileやplatformの情報を活用していくことになります。

HTTP_USER_AGENTとHTTP_SEC_CH_UAを併用した判別


User-Agent Client HintsのAPIはまだ、すべてのWebブラウザにサポートされているわけではなく、Google ChromeやMicrosoft EdgeなどChromiumベースのWebブラウザのみとなっていますので、どちらの方法でも動作できるようにするには、これまでの方法と合わせて利用していく必要があります。

PHPのisset関数を使い、$_SERVER[‘HTTP_SEC_CH_UA’]で情報が取得できる、値があるかないかを条件とします。取得でき値があれば(trueなら)HTTP_SEC_CH_UAの処理を、取得できず値がなければ(false)これまでの HTTP_USER_AGENTで処理させます。
また、HTTP_SEC_CH_UAの処理でPCとモバイル端末を判別する場合は、$_SERVER[‘HTTP_SEC_CH_UA_MOBILE’]の情報を条件に処理を切り分けます。
返す値が「?1」であればモバイル端末であることがわかります。

MobileとPCの判別(確認用)

<?php
if (isset($_SERVER['HTTP_SEC_CH_UA'])) {
  // HTTP_SEC_CH_UA
  $ua_ch = $_SERVER['HTTP_SEC_CH_UA'];
  $ua_ch_mobile = $_SERVER['HTTP_SEC_CH_UA_MOBILE'];
  $ua_ch_platform = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'];
  echo 'UA-CH: ' . $ua_ch . '<br>';
  echo 'Mobile:  ' . $ua_ch_mobile . '<br>';
  echo 'Device: ' . $ua_ch_platform . '<br>';
  if ($_SERVER['HTTP_SEC_CH_UA_MOBILE']=='?1') {
    echo  'Result - Mobile<br>';
  } else {
    echo  'Result - PC<br>';
  }
} else {
  // HTTP_USER_AGENT
  $ua = $_SERVER['HTTP_USER_AGENT'];
  echo $ua, '<br>';
}
?>



iPadのSafariでは、HTTP_USER_AGENTでもMobileやiPadといった文字が含まれず、HTTP_SEC_CH_UAでもPCとして認識されます。

HTTP_SEC_CH_UAでモバイルやPCのOSを細かく判別する場合は、以下のようにstrpos()関数を使って、platformの情報に対象の文字列が含まれているかで判別できます。

if ($_SERVER['HTTP_SEC_CH_UA_MOBILE']=='?1') {
  echo  'Result - Mobile<br>';
  if (strpos($ua_ch_platform, 'Android')) {
    echo 'Android';
  } else {
    // Other
  }
} else {
  echo  'Result - PC<br>';
  if (strpos($ua_ch_platform, 'macOS')) {
    echo 'macOS';
  } else if (strpos($ua_ch_platform, 'Windows')) {
    echo 'Windows';
  } else {
    // Other
  }
}

最後に


モバイルはスマートフォン端末でiPadはPCと同じとして処理する場合は、PHPでデバイスを判別してもいいでしょう。
JavaScriptであればタッチデバイスの判別もできるので、しっかりiPadとして判別して処理する必要がある場合は、JavaScriptでデバイスを判別することをおすすめします。
JavaScriptについては、以下の記事でご紹介しています。


HTTP_USER_AGENTは廃止の方向に進んでいますので、User-Agent Client Hintsも利用した方法を覚えておくと良いでしょう。