Safariのタブ「Top Sites」によるアクセス水増し対策

posted Oct 9, 2013, 3:07 PM by Makoto Shimizu   [ updated Oct 9, 2013, 3:11 PM ]

Macの標準ブラウザ「Safari」を起動したりタブを追加すると、「Top Sites」タブによく訪問するサイトがサムネイル画像で表示されます。

実は裏でリクエストが走る

このサムネイル画像はサーバー側で作成されるわけではなく、Mac上のSafariが各サイトにHTTPリクエストを投げます。この時、正しくレンダリングするために、HTMLに加えてCSSやJavaScriptファイルもロードして実行するので、ページに埋め込まれたWeb解析やターゲティングなどのタグも実行され、その結果、訪問していないのにアクセスが水増しされることがあります。

Charles Web Debugging Proxyなどで通信内容を確認すると、計測用リクエストを確認できます。

影響範囲

Mac版Safariの「Top Sites」にサイト内のページが表示され、そのサムネイル画像が古くなっている場合にトラフィックが発生します。

少しはブラウザ側でキャッシュされるので、タブを開くたびにリクエストされるわけではありません。Safariを終了しても直ぐに立ち上げれば、キャッシュが残っています。

解析データには、以下のような悪影響を与えます。

  • 訪問回数や訪問者数が実際よりも増える(クリックしてアクセスされた場合は増えない)
  • 直帰率が実際よりも高くなる
  • リファラータイプのレポートで「手動/ブックマーク」が実際よりも増える
  • 該当ページで計測しているPropやeVarのインスタンスが実際よりも増える
Mac版のSafariは普通は高くないので誤差の範囲と見なすこともできますが、アップル関連情報が多いメディアサイトなどは影響が高めかもしれません。

水増しを防ぐ方法

サムネイル画像を作成するためのHTTPリクエストを判別する方法は2種類あります。

1. HTTPヘッダを見る

HTTPヘッダに「X-Purpose: preview」という独自ヘッダが付与されています。


ただし、HTTPヘッダはリクエストされたサイトのWebサーバー側でしか取得できないので、実装が面倒です。

PHPの場合は以下のように書いてヘッダを判別します。

if($_SERVER["HTTP_X_PURPOSE"]=="preview") { ... }

2. JavaScriptのプロパティを見る

navigator.loadPurpose」というプロパティに「preview」がセットされていれば、プレビュー用のリクエストだと分かります。

/* Stop Safari Top Sites requests from being sent */
if (navigator && navigator.loadPurpose && navigator.loadPurpose == 'preview') {
      //サーバーコールを止める
}

Adobe Analytics(旧SiteCatalyst)のサーバーコールを止めるためには、s.abort = true; をセットしたり、s.t(); を実行しない、などの処理が必要です。

このサイトで実際に実装してみました。新しいJSライブラリを採用しているので、s_code.js ではなく AppMeasurement-www.cms-ia.info.js が計測用JavaScriptのファイル名です。

関連情報

Comments