Sec-CH-UAクライアント・ヒント・ヘッダーによるUA判定をクラウド側で行う方法
クライアント・ヒントによるUA判定をクラウドで行うには、クラウドから利用者ブラウザに対し、Accept-CH httpヘッダーを送信し、CH(Client Hints)を要求する必要がある。
CHは実験段階のため、対応していないブラウザがあるし、対応しているブラウザであってもクラウドサイドで取得しようとしても取得できない場合がある。(20211116現在)
クライアントサイドで行う方が簡単だし、確実に取得できる。
そのため、jsでCH情報を取得し、rest apiでクラウドに通知することを薦める。
この場合は、httpヘッダーでAccept-CH要求をする必要はない。
js
js
if(navigator.userAgentData === undefined) {
//Safari
} else {
//Edge Chrome
navigator.userAgentData.getHighEntropyValues(["architecture", "model", "platform", "platformVersion","uaFullVersion"])
.then(ua => {
var osName = ua["platform"];
var osVersion = ua["platformVersion"]; //"13.0.0"以上ならWindows11
var browserFullVersion = ua["uaFullVersion"];
});
}
クラウドサイドで取得するには、CH情報ヘッダーをhttpリクエストに含めてもらう必要があるので、Accept-CH httpヘッダーをブラウザに送信する。
(jsでCHを取得する場合には必要ない。)
js
html
<meta http-equiv="Accept-CH" content="Sec-CH-UA, Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List">
php
.htaccess
# http headerによりCH(クライアント・ヒント)をブラウザに要求
Header set Accept-CH "Sec-CH-UA, Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List"
php
php
// http headerによりCH(クライアント・ヒント)をブラウザに要求
header("Accept-CH: Sec-CH-UA, Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List");
<注意点>
*http1.1に対応のクラウド(http2に未対応クラウド)では、セッションごとに毎回Accept-CH要求する必要があるため、クライアント・ヒントを取得するためには、1回のセッションで、2ファイル以上をやり取りする必要がある。(a.html, b.pngなど)
*http2対応のクラウドとブラウザ(現在の全ての主要ブラウザ)間では、タブを起動してから終了するまでが一つのセッションである。
(過去のhttp1.1対応ブラウザでは、1つのhtmlファイルにembededしているファイル群をまとめて1つのHTTPセッションとしていた。)
*ここで言うセッションとは、httpプロトコルにおいてTCPコネクションの確立からクローズまでの期間のこと。
*Accept-CH要求をしないと、オペレーティングシステムバージョンとブラウザーバージョンはダミー値が返される。(User-Agentヘッダー値)
php
Windows/Chrome
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.0 (KHTML, like Gecko) Chrome/95.0.0 Safari/537.00
*ダミー値の濃淡は、2023年まで2年かけて少しずつダミー値に置き換わる予定だ。
*Chrome、EdgeはCH(Client Hints)に対応しているが、Safari(iOSを含む)はSec-CH-UA-Platformヘッダー、Sec-CH-UA-Platform-Versionヘッダーを含むSec-CH-UAに未対応のため、従来のUser-Agentヘッダーを取得する。(20211116現在)
オペレーティングシステム名を求める
php
php
//http header: Sec-CH-UA-Platform
//'Windows'
$osName = $_SERVER['HTTP_SEC_CH_UA_PLATFORM'];
オペレーティングシステム・バージョンを求める
php
php
//http header: Sec-CH-UA-Platform-Version
//"13.0.0"以上ならWindows11
$osVersion = $_SERVER['HTTP_SEC_CH_UA_PLATFORM_VERSION'];
既存の旧OS判定プログラムがある場合には、前述の旧UA文字列の該当箇所をCH値から求めた値に置き換えるのが有効な対応方法と考えられる。