[小ネタ] iPhoneのデスクトップ用サイト表示機能はAmazon CloudFrontでどのように判定されるのか確認してみた
はじめに
清水です。Amazon CloudFrontにはデバイス判定機能があり、デバイスごとに異なるレスポンスを返すために使用できます。(正確にはデバイスタイプに基づいてオブジェクトをキャッシュすることができます。)今回このデバイス判定機能がスマートフォン(iPhone)のデスクトップ用サイト表示機能を有効化したときにどのようにデバイスを判別するのか、確認する機会がありましたのでまとめてみたいと思います。
なお、結果だけ先にまとめると、iPhoneのデスクトップ用サイト表示機能を有効化するとAmazon CloudFrontのデバイス判定としてはDesktopと判定される、という結果になりました。
Amazon CloudFrontのデバイス判定
Amazon CloudFrontでは、User-Agentヘッダの値に基づいて以下のカスタムヘッダにtrueまたはfalseの文字列が設定されます。CloudFront側で該当ヘッダをオリジンに転送するよう設定し、オリジン側でこのカスタムヘッダを参照することでアクセス元のデバイスを判定することができます。
- CloudFront-Is-Desktop-Viewer
- CloudFront-Is-Mobile-Viewer
- CloudFront-Is-SmartTV-Viewer
- CloudFront-Is-Tablet-Viewer
User-Agentヘッダをオリジンに転送、オリジン側でUser-Agentヘッダの値からデバイス判定することも可能ではありますが、様々なUser-Agentがあるためキャッシュヒット率の低下につながります。
- デバイスタイプに基づいてオブジェクトをキャッシュするように CloudFront を設定する(リクエストヘッダーに基づくコンテンツのキャッシュ - Amazon CloudFront)
- [新機能] Amazon CloudFrontでモバイル端末を判定できるようになりました | DevelopersIO
スマートフォンのデスクトップ用サイト表示機能
スマートフォンにはデスクトップ用サイト表示用の機能が備わっており、表示サイズが小さくなりながらもスマートフォン用の表示ではなくPC用の表示を見ることができます。(もちろんサイト側が対応している必要はありますが。)例えばiPhoneのSafariではアドレスバー右側の再読込ボタンを長押しすると「デスクトップ用サイトを表示」ボタンが現れ、デスクトップ用サイト表示を確認できます。以下はYahoo!のサイトで確認してみた例です。
通常のスマートフォン用表示でアドレスバー右側の再読込ボタンを長押し、「デスクトップ用サイトを表示」ボタンが現れます | デスクトップ用サイト表示機能を有効化させたところ。表示サイズは小さいながらもPC用の表示で閲覧ができています |
確認する環境の構築
CloudFrontのデバイス判定、そしてスマートフォンのデスクトップ用サイト表示機能を抑えたところで、本題となるこのデスクトップ用サイト表示機能を有効化したときにCloudFrontがどのようにデバイスを判定するのか、確認をしていきます。と、まずは確認の前に動作させる環境を構築します。今回はCloudFront-ELB-EC2の以下のイメージの環境を準備しました。
CloudFrontではBehaviorの設定で以下のように、すべてのヘッダを転送するように設定しておきます。(今回は確認のためすべてのヘッダを転送するよう設定しましたが、デバイス判定だけならCloudFront-Is-*-Viewer
の必要なヘッダのみオリジンに転送すれば実現できます。)
またオリジン側ではEC2にApache+PHPをインストールし、以下のコードでオリジン側で受け取ったヘッダをすべて出力するようにしました。(``
``タグの出力は整形用です。)
<?php foreach (getallheaders() as $name => $value) { echo "<p>"; echo "$name: $value\n"; echo "</p>"; } ?>
実際に確認してみた
では実際に確認してみたいと思います。環境はiPhone XS/iOS 12.0で行い、Safari、Chrome、Firefoxのそれぞれでデスクトップ用サイト表示機能の有無を確認してみました。以下にそれぞれのブラウザでの画面キャプチャをまとめますが、結果としては今回確認してみたいずれのブラウザでも、以下のように判定されました。
- スマホのブラウザで表示した場合(通常の場合)
- CloudFront-Is-Mobile-Viewer: true
- CloudFront-Is-Desktop-Viewer: false
- デスクトップ用サイト表示機能を有効にした場合
- CloudFront-Is-Mobile-Viewer: false
- CloudFront-Is-Desktop-Viewer: true
また興味深い点としては、デスクトップ用サイト表示機能を有効にし場合はUser-Agentが「Macintosh; Intel Mac OS X 10_1?_?」とmacOS扱いとなる点ですね。CloudFrontではこのUser−Agentヘッダを見てmacOSと判定しMobileではなくDesktopデバイスとして扱っているかと推測できます。
Safari
Safariでは先に述べた通り、アドレスバー右側の再読込ボタンを長押しすると「デスクトップ用サイトを表示」ボタンが現れ、このボタンからデスクトップ用サイトを表示することができます。
Safariで通常表示させた状態 | Safariでデスクトップ用サイトを表示させた場合 |
Chrome
Chromeでは右下のメニュー(…)から「PC版サイトをリクエスト」を選択することで、デスクトップ用表示に切り替えることができます。
Chromeで通常表示させた状態 | ChromeでPC版サイトをリクエストした状態 |
Firefox
Firefoxではアドレスバー右側のメニュー(…)から「PCサイトモード」を選択することで、デスクトップ用表示に切り替えることができます。
Firefoxで通常表示させた状態 | FirefoxでPCサイトモードで表示させた状態 |
まとめ
iPhoneのデスクトップ用サイト表示機能を有効化した場合、Amazon CloudFrontのデバイス判定機能はどのデバイスとして判定するのかを確認してみました。iPhone XS/iOS 12.0上のSafari、Chrome、Firefoxの3種のブラウザで確認したところ、いずれのブラウザでもモバイル端末ではなくデスクトップ端末と判定されていることがわかりました。スマートフォン用には専用のページを表示したいけど、ユーザがデスクトップ用サイト表示機能を使用した場合にはデスクトップ用のページを表示させたい、という場合にも、Amazon CloudFrontのデバイス判定用ヘッダが活用できそうですね。