なぜ1x1ピクセルのGIF(Webバグ)データを提供するのですか?


81

多くの分析および追跡ツールは、クロスドメインイベントの保存/処理のために1x1 GIF画像(Webバグ、ユーザーには表示されません)を要求しています。

なぜこのGIF画像を提供するのですか?503 Service Temporary Unavailableや空のファイルなどのエラーコードを返す方が効率的ではないでしょうか?

更新:より明確にするために、必要なすべての情報がすでにリクエストヘッダーで送信さているのに、なぜGIF画像データを提供するのかを尋ねています。GIF画像自体は有用な情報を返しません。

回答:


70

ダグの答えはかなり包括的です。私は追加のメモを追加すると思いました(OPの要求に応じて、私のコメントから)

ダグの答えは、1x1ピクセルのビーコンが使用目的で使用される理由を説明しています。応答にHTTPステータスコード204、コンテンツなしを使用し、画像本文を送信しないという、潜在的な代替アプローチの概要を説明したいと思いました。

204コンテンツなし

サーバーは要求を実行しましたが、エンティティ本体を返す必要はなく、更新されたメタ情報を返したい場合があります。応答には、エンティティヘッダーの形式で新しいメタ情報または更新されたメタ情報が含まれる場合があります。メタ情報が存在する場合は、要求されたバリアントに関連付ける必要があります。

基本的に、サーバーはリクエストを受信し、本文を送信しないことを決定します(この場合、画像を送信しません)。しかし、これは意識的な決定であったことをエージェントに通知するコードで応答します。基本的に、それは肯定的に応答するためのより短い方法です。

Googleのページスピードのドキュメント

非同期でページビューを記録する一般的な方法の1つは、ターゲットページの下部に(またはonloadイベントハンドラーとして)JavaScriptスニペットを含めることです。これは、ユーザーがページを読み込んだときにログサーバーに通知します。これを行う最も一般的な方法は、「ビーコン」のサーバーへの要求を作成し、対象のすべてのデータをビーコンリソースのURLのパラメーターとしてエンコードすることです。HTTP応答を非常に小さく保つには、透明な1x1ピクセルの画像がビーコン要求の候補として適しています。もう少し最適なビーコンは、1x1GIFよりもわずかに小さいHTTP204応答(「コンテンツなし」)を使用します。

私は試したことがありませんが、理論的には、gif自体を送信しなくても同じ目的を果たし、GoogleAnalyticsの場合は35バイト節約できます。(物事のスキームでは、1日あたり何兆ものヒットを提供するGoogle Analyticsでない限り、35バイトは実際には何もありません。)

次のコードでテストできます。

var i = new Image(); 
i.src = "http://httpstat.us/204";

12
これらのあまり知られていないHTTPステータスコード(203、204、205)は、実際にはゴールドです。彼らは現在よりも多くの使用を見るはずです。
あなた

1
いいもの-実際、私が使用できる情報。私から+1。
ダグ2011

1
要約できるかどうかを見てみましょう。HTTP応答コードのアプローチには同じクライアント要求が含まれます。唯一の違いは、サーバーが1x1 gif(および、おそらく200)を返すのではなく、204をクライアントに返すことです。
ダグ2011

2
しかし、204応答コードを返すものをどのように要求しますか?
ユルゲンポール

3
なぜ画像なのかわかりません。空の文字列を返さないのはなぜですか?
Weishi Zeng 2016

65

まず、私は前の2つの答えに同意しません-どちらも質問に関与しません。

1ピクセルの画像は、HTTPプロトコルで作業する際のWebベースの分析アプリ(Google Analyticsなど)の本質的な問題、つまりクライアントからサーバーにデータを転送する方法(Webメトリック)を解決します

プロトコルで説明されている最も単純なメソッドで、最も単純な(少なくとも、要求の本文を含む最も単純なメソッド)は、GET要求です。このプロトコル方式によれば、クライアントはサーバーへのリソース要求を開始します。サーバーはこれらの要求を処理し、適切な応答を返します。

GAのようなWebベースの分析アプリの場合、この一方向スキームは悪いニュースです。サーバーがクライアントからオンデマンドでデータを取得できるようには見えないためです。繰り返しになりますが、サーバーが実行できるのはリソースを供給することだけです。それらを要求します。

では、クライアントからサーバーにデータを戻す問題の解決策は何でしょうか。HTTPコンテキスト内には、GET以外のプロトコルメソッド(POSTなど)がありますが、これは多くの理由で制限されたオプションです(フォームデータの送信など、まれで特殊な使用法からも明らかです)。

ブラウザからGETリクエストを見ると、リクエストURLとリクエストヘッダー(リファラーヘッダーやユーザーエージェントヘッダーなど)で構成されていることがわかります。後者には、クライアントに関する情報(ブラウザの種類やバージョン、ブラウザ言語、オペレーティングシステムなど。

繰り返しますが、これはクライアントがサーバーに送信するリクエストの一部です。したがって、1ピクセルのgifを動機付けるアイデアは、クライアントがWebメトリックデータをサーバーに送信し、リクエストヘッダーにラップすることです。

しかし、クライアントにリソースを要求させて、メトリックデータの送信に「だまされる」ことができるようにするにはどうすればよいでしょうか。そして、サーバーが必要とする実際のデータをクライアントに送信させる方法は?

Google Analyticsは良い例です。ga.jsファイル(クライアントへのダウンロードがWebページの小さなスクリプトによってトリガーされる大きなファイル)には、特定のリソースから特定のリソースを要求するようにクライアントに指示する数行のコードが含まれています。サーバー(GAサーバー)およびリクエストヘッダーにラップされた特定のデータを送信します。

ただし、このリクエストの目的は実際にリソースを取得することではなく、サーバーにデータを送信することであるため、このリソースはできるだけ小さくし、Webページに表示されたときに表示されないようにする必要があります。つまり、1 x 1ピクセル透明gif。サイズは可能な限り最小のサイズであり、フォーマット(gif)は画像フォーマットの中で最小です。

より正確には、すべてのGAデータ(すべての単一アイテム)がアセンブルされ、リクエストURLのクエリ文字列(「?」の後のすべて)にパックされます。ただし、そのデータをクライアント(データが作成された場所)からGAサーバー(ログに記録されて集計された場所)に送信するには、HTTPリクエストが必要です。したがって、ga.js(ダウンロードされたGoogle分析スクリプト)が必要です。ページの読み込み時に呼び出される関数の結果としてクライアントによってキャッシュされる)は、すべての分析データ(Cookie、ロケーションバー、リクエストヘッダーなど)を1つの文字列に連結するようにクライアントに指示します。それをクエリ文字列としてURL(* http://www.google-analytics.com/__utm.gif *?)に追加すると、それがリクエストURLになります

ブラウザに表示されているWebページのHTTPリクエストを表示できるWebブラウザ(SafariのWeb Inspector、Firefox / Chrome Firebugなど)を使用して、これを証明するのは簡単です。

たとえば、企業のホームページへの有効なURLをブラウザのロケーションバーに入力すると、そのホームページが返され、ブラウザに表示されます(主要な分析アプリの1つであるGAを使用する任意のWebサイト/ページを選択できます。 、Omniture、Coremetricsなど)

使用したブラウザはSafariだったので、メニューバーの[開発]をクリックしてから[ Webインスペクターを表示]をクリックしました。Webインスペクターの一番上の行で、[リソース]をクリックし、左側の列に表示されているリソースのリストからutm.gifリソースを見つけてクリックし、[ヘッダー]タブをクリックします。これにより、次のように表示されます。

Request URL:http://www.google-analytics.com/__utm.gif?
           utmwv=1&utmn=1520570865&
           utmcs=UTF-8&
           utmsr=1280x800&
           utmsc=24-bit&
           utmul=enus&
           utmje=1&
           utmfl=10.3%20r181&

Request Method:GET
Status Code:200 OK

Request Headers
    User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/533.21.1 
                 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1

Response Headers
    Cache-Control:private, no-cache, no-cache=Set-Cookie, proxy-revalidate
    Content-Length:35
    Content-Type:image/gif
    Date:Wed, 06 Jul 2011 21:31:28 GMT

注意すべき重要なポイントは次のとおりです。

  1. 上記の最初の行で証明されているように、リクエストは実際にはutm.gifのリクエストでした:*リクエストURL:http://www.google-analytics.com/__utm.gif*。

  2. Google Analyticsのパラメーターは、リクエストURLに追加されたクエリ文字列に明確に表示されます。たとえば、 utmsrは、クライアントの画面解像度を参照するGAの変数名であり、私にとっては1280x800の値を示しています。utmflはフラッシュバージョンの変数名で、値は10.3などです。

  3. レスポンスヘッダと呼ばれる のContent-Type:1x1ピクセルのGIFたリソースが要求され、返されたことを確認しても、(クライアントへのサーバのバックにより送信された)で のContent-Type:画像/ gif形式

クライアントとサーバー間でデータを転送するためのこの一般的なスキームは、永遠に存在します。これを行うためのより良い方法があるかもしれませんが、それは私が知っている唯一の方法です(ホストされた分析サービスによって課せられた制約を満たします)。


3
@dougすばらしい答え。私はそれを書いていればよかったのですが:)HTTP Status Code 204応答に使用できる可能性についてのメモを投げる価値があるかもしれません。これを参照してください:code.google.com/speed/page-speed/docs/rtt.html試したことはありませんが、理論的には、gif自体を送信しなくても同じ目的を果たすはずです。var i=new Image(); i.src = "http://sharedcount.com/test/beacon.gif";は一例ですが、ブラウザの問題が発生するかどうかはわかりません。
Yahel 2011

9
答えではないので、これは最悪の答えではありません:)必要なデータはすでにリクエストで送信されているので、GIF画像を提供する理由を尋ねました。
Viliam 2011

2
ネガティブになりすぎたくない、ごめんなさい。これはウェブバグの良い説明です。しかし、なぜGIFデータを提供するのですか?
Viliam 2011

@yahelc:それは素晴らしいことです。他の人への答えとして追加することを検討してください。コメントとして、それはほとんど見えません。
Viliam

@Villiam確かに、それを追加しました。
Yahel 2011

14

一部のブラウザでは、リソースを読み込めなかった場合にエラーアイコンが表示される場合があります。これにより、サービスのデバッグ/監視も少し複雑になります。監視ツールがエラーを適切な結果として処理することを確認する必要があります。

OTOHあなたは何も得られません。サーバー/フレームワークによって返されるエラーメッセージは、通常、1x1イメージよりも大きくなります。これは、基本的に無料でネットワークトラフィックを増やすことを意味します。


1
分析アプリ(Google Analytics、Yahoo Analytics、Omnitureなど)が1x1ピクセルのgif画像をWebページに配置する理由は、アプリの「デバッグ」とはまったく関係ありません
ダグ2011

3
@ doug-mruが指摘しているのは、意図的にエラーコードを返す場合は、「真の」エラーコードと返すつもりのエラーコードを区別する必要があるということです。したがって、話の教訓は、その結果が意図したものである場合、結果としてエラーコードを返さないことです。
Moo 2011

3
エラー応答がGIF画像よりも大きくなるとは思えません。200OKの応答もGIF画像とともに送信されることに注意してください。
Viliam 2011

2
@Villiamほとんどの環境は、エラーコードを返すだけでなく、エラーを説明したり、より多くの情報を提供したりする、適切なスタイルのhtmlページも返します。
Ulrich Dangel 2011

8

このようなGIFはブラウザでの表示が既知であるため、1ピクセルのピリオドです。それ以外のものは、ページの実際のコンテンツに視覚的に干渉するリスクがあります。

HTTPエラーは、エラーテキストの特大フレームとして、またはポップアップウィンドウとして表示される場合があります。一部のブラウザは、空の応答を受信した場合にも文句を言う場合があります。

さらに、ページはめ込み画像は、すべてのブラウザでデフォルトで許可されている数少ないデータ型の1つです。それ以外の場合は、明示的なユーザーアクションをダウンロードする必要があります。


1
あなたの答えは、リソースを提供する目的について何も述べていません。つまり、なぜリソースを提供する必要があるのですか?あなたの答えは、「なぜ別の種類の画像形式の代わりに1x1 gifを提供するのですか?それは簡単な答えのある簡単な質問です(つまり、gif形式はjpeg、pngよりもピクセルごとに小さいサイズです) 、tiffなど)
ダグ2011

JavascriptImageオブジェクトを使用してGIFの読み込みを呼び出すことができます。エラーはユーザーに報告されません。
Viliam 2011

@Villiam実際に画像を返すことで、JavaScriptが有効になっていないブラウザを追跡することもできます<noscript>。画像タグを挿入するだけで、機能します。また、サーバー側でjsを介したリクエスト(エラーを返す)とDOMの要素を介したリクエスト(画像を返す)を区別するために何もする必要はありません
Ulrich Dangel 2011

4

これは、OPの質問「なぜGIF画像データを提供するのか...」に答えるためです。

一部のユーザーは、イベントログサービスを呼び出すために単純なimgタグを付けます-

<img src="http://www.example.com/logger?event_id=1234">

この場合、画像を提供しないと、ブラウザにプレースホルダーアイコンが表示され、見苦しくなり、サービスが壊れているように見えます。

私がやっていることは、Acceptヘッダーフィールドを探すことです。このようなimgタグを介してスクリプトが呼び出されると、リクエストのヘッダーに次のようなものが表示されます-

Accept: image/gif, image/*
Accept-Encoding:gzip,deflate
...

存在する場合に、「画像/」*の文字列受け入れヘッダフィールド、Iは、そうでなければ、私はちょうど204で応答し、画像を供給する。


2

主な理由はCookieを添付することです。そのため、ユーザーが一方の側からもう一方の側に移動しても、Cookieを添付するための同じ要素があります。


0

Beacon API(https://w3c.github.io/beacon/)を使用している場合は、画像を提供する必要はありません)実装メソッド。

サーバーのログファイルにアクセスできる場合は、エラーコードが機能します。画像を提供する目的は、ログファイルで通常行うよりも多くのユーザーに関するデータを取得することです。


0

@MaciejPerlińskiは基本的に正しいですが、詳細な回答が有益だと思います。

なぜ204 No-Contentステータスコードではなく1x1GIFなのですか?

204 No-Content サーバーがすべての応答ヘッダー(Content-Type、Content-Length、Content-Encoding、Cache-Controlなど)を省略し、0バイトの空の応答本文を返すことを可能にします(そして多くの不要な帯域幅を節約します)。

ブラウザは、204 No-Content応答を尊重し、応答ヘッダーと応答本文を期待/待機しないことを知っています。

サーバーが応答ヘッダー(cache-controlまたはなどcookie)を設定する必要がある場合、204 No-Contentブラウザーは設計上(HTTPプロトコル仕様に従って)応答ヘッダーを無視するため、サーバーは使用できません。

なぜ1x1GIFであり、ステータスコードContent-Length: 0付きのヘッダーではないの200 OKですか?

いくつか例を挙げると、おそらくいくつかの問題が混在しています。

  • 従来のブラウザの互換性
  • ブラウザでのMIMEタイプチェック、0バイトは有効な画像ではありません。
  • 200 OK 0バイトの場合、中間プロキシサーバーとVPNで完全にサポートされない可能性があります
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.