最新のWebアプリケーションでは、CDN(コンテンツ配信ネットワーク)を使用してリソースの負荷を加速することがますます一般的になっています。 CDNは、キャッシュされたコンテンツによる負荷速度を上げ、世界中のサーバーに配布することができます。ただし、場合によっては、特にクライアントデバイス情報を特定する場合、CDNもいくつかの問題を引き起こす可能性があります。
get_client_version関数は、通常、クライアントのバージョン情報を取得するために使用されます。特に、端子デバイスの種類またはバージョン番号を審査する必要があるシナリオです。この関数は、一般に、要求されたHTTPヘッダーまたはURLの一部の情報に基づいて、デバイスのタイプまたはバージョンを決定します。
次のようにPHP機能があるとします。
function get_client_version() {
// ユーザーエージェントを取得します
$user_agent = $_SERVER['HTTP_USER_AGENT'];
// ユーザーエージェントに基づいてデバイスバージョンを判断したいとします
if (strpos($user_agent, 'Android') !== false) {
return 'Android Version 10';
} elseif (strpos($user_agent, 'iPhone') !== false) {
return 'iPhone Version 12';
} else {
return 'Unknown Device';
}
}
上記の例では、 get_client_version関数は、 $ _server ['http_user_agent']を介してクライアントのユーザーエージェント情報を取得し、デバイスタイプを判断します。
通常の状況では、 get_client_version関数は、httpが要求したユーザーエージェントを介してデバイス情報を取得します。ただし、WebアプリケーションがCDN環境に展開されると、次の問題が発生する可能性があり、デバイス識別にバイアスが発生する可能性があります。
キャッシュの問題
CDNは静的リソースをキャッシュし、ローカルサーバーに配布します。場合によっては、CDNはリクエストヘッダーのユーザーエージェント情報をキャッシュします。異なる端子が同じリソースを要求する場合、CDNはキャッシュされた応答を返すことがあり、この応答のユーザーエージェント情報は実際の要求された端子デバイスと矛盾しています。その結果、 get_client_version関数は、クライアントのデバイスを誤って判断する可能性があります。
CDNのプロキシレイヤー
通常、CDNサーバーはプロキシとして機能し、元のリクエストをバックエンドサーバーに転送します。このプロセスでは、CDNのプロキシサーバーがリクエストヘッダーを変更したり、ユーザーエージェントなどの負荷分散ポリシーに従って情報を変更したりすることがあります。これにより、 get_client_version関数がデバイス情報を間違えます。
IPアドレスの影響<br> CDNがIPアドレスに基づいて要求のソースを決定し、デバイスタイプを決定する場合があります。ただし、CDNは通常、リクエストを異なるサーバーに配布するため、そのような判断は正確ではない場合があります。特に、同じIPアドレス要求が異なる端子から来る場合、CDNはそれらを誤って同じデバイスであると考える可能性があるため、バージョンの決定に影響します。
cdn環境でget_client_version関数を使用するときに端末デバイスの誤判定を避けるために、次の方法を考慮することができます。
キャッシュを無効にする<br> デバイス情報を取得するリクエストについては、CDNキャッシュを避けるようにしてください。これは、特定のキャッシュポリシー(キャッシュの無効化、キャッシュヘッダーの追加など)を設定することで実現できます。このようにして、CDNはバックエンドを要求して、毎回最新のデバイス情報を取得します。
実際のクライアントリクエストヘッダーを確認してください<br> X-Forwarded-Forなどのヘッダーフィールドを使用して、CDNプロキシレイヤーによって変更された要求ヘッダーではなく、端子に最も近い元の要求情報が取得されるようにします。
JavaScriptを使用して、デバイス情報を取得します<br> 場合によっては、サーバー側のユーザーエージェントに依存する代わりに、JavaScriptを介してクライアントにデバイス情報を取得できます。これにより、CDN層からの干渉を回避できます。 JavaScriptを介してデバイス情報を取得するための例のコードは次のとおりです。
var deviceInfo = navigator.userAgent;
console.log(deviceInfo); // 出力デバイスUser-Agent情報
この情報は、サーバーに渡され、サーバーがデバイスを正しく識別できるようにします。
動的要求<br> 正確なデバイス情報を必要とする関数の場合、 get_client_version関数は、CDNを介してキャッシュされた静的リソースの代わりに、別の要求に配置できます。これにより、デバイス情報取得プロセスがより正確で動的になります。
CDN環境では、 get_client_version関数は、キャッシュやプロキシ層の干渉などの要因の影響を受ける可能性があり、端子デバイスの誤判定をもたらします。これを回避するために、開発者はキャッシュの無効化、元のリクエストヘッダーの取得の確保、JavaScriptを使用してデバイス情報を取得してデバイス識別の精度を確保するなどの方法を使用できます。これらの最適化により、ターミナル機器情報の正確な獲得をより適切に保証し、ユーザーエクスペリエンスを向上させることができます。