まず、私は前の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:
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
注意すべき重要なポイントは次のとおりです。
上記の最初の行で証明されているように、リクエストは実際にはutm.gifのリクエストでした:*リクエストURL:http://www.google-analytics.com/__utm.gif*。
Google Analyticsのパラメーターは、リクエストURLに追加されたクエリ文字列に明確に表示されます。たとえば、
utmsrは、クライアントの画面解像度を参照するGAの変数名であり、私にとっては1280x800の値を示しています。utmflはフラッシュバージョンの変数名で、値は10.3などです。
レスポンスヘッダと呼ばれる
のContent-Type:1x1ピクセルのGIFたリソースが要求され、返されたことを確認しても、(クライアントへのサーバのバックにより送信された)で
のContent-Type:画像/ gif形式
クライアントとサーバー間でデータを転送するためのこの一般的なスキームは、永遠に存在します。これを行うためのより良い方法があるかもしれませんが、それは私が知っている唯一の方法です(ホストされた分析サービスによって課せられた制約を満たします)。