首先,我不同意前面的两个答案——都没有涉及到这个问题。
单像素图像解决了在 HTTP 协议中工作时基于网络的分析应用程序(如 Google Analytics)的一个内在问题——如何将(网络指标)数据从客户端传输到服务器。
协议描述的最简单的方法,最简单的(至少是包含请求主体的最简单的方法)是GET 请求。根据该协议方式,客户端向服务器发起资源请求;服务器处理这些请求并返回适当的响应。
对于像 GA 这样的基于 Web 的分析应用程序,这种单向方案是个坏消息,因为它似乎不允许服务器按需从客户端检索数据——同样,所有服务器都可以做的是提供资源而不是请求它们。
那么解决将数据从客户端返回到服务器的问题的解决方案是什么? 在 HTTP 上下文中,除了 GET(例如 POST)之外,还有其他协议方法,但这是一个有限的选择出于多种原因(如提交表单数据等不常见且专门的用途证明)。
如果您从浏览器查看 GET 请求,您会发现它由请求 URL 和 请求标头(例如,Referer 和 User-Agent Headers),后者包含有关客户端的信息——例如,浏览器类型和版本、浏览器语言、操作系统等。
同样,这是客户端发送到服务器的请求的一部分。所以激发单像素 gif 的想法是让客户端将 Web 指标数据发送到服务器,并封装在请求标头中。
然后如何让客户端请求资源,以便它可以被“欺骗”发送指标数据?以及如何让客户端发送服务器想要的实际数据?
Google Analytics 就是一个很好的例子:ga.js 文件(由网页中的小脚本触发下载到客户端的大文件)包含几行代码,指示客户端从特定服务器(GA 服务器)请求特定资源,并发送包装在请求标头中的特定数据。
但是由于这个 Request 的目的不是实际获取资源,而是向服务器发送数据,所以这个资源应该尽可能小,并且在呈现在网页中时不应该是可见的——因此, 1 x 1 像素透明 gif。尺寸是可能的最小尺寸,格式 (gif) 是图像格式中最小的。
更准确地说,所有 GA 数据(每一项)都被组装并打包到 请求 URL 的查询字符串(“?”之后的所有内容)中。但是为了让数据从客户端(创建它的地方)到 GA 服务器(记录和聚合它的地方),必须有一个 HTTP 请求,所以 ga.js(下载的谷歌分析脚本,除非它是由客户端缓存,作为页面加载时调用的函数的结果)指示客户端组装所有分析数据 - 例如,cookie、位置栏、请求标头等 - 将其连接成单个字符串并将其作为查询字符串附加到 URL (*http://www.google-analytics.com/__utm.gif*?) 并成为 请求 URL .
使用任何允许您查看浏览器中显示的网页的 HTTP 请求的网络浏览器很容易证明这一点(例如,Safari 的 Web Inspector、Firefox/Chrome Firebug 等)。
例如,我在浏览器的位置栏中输入了公司主页的有效 url,它返回该主页并将其显示在我的浏览器中(我可以选择使用主要分析之一的任何网站/页面应用程序、GA、Omniture、Coremetrics 等)
我使用的浏览器是 Safari,所以我点击了菜单栏中的 Develop,然后点击了 Show Web Inspector。在 Web Inspector 的第一行,单击 Resources,从左侧列中显示的资源列表中找到并单击 utm.gif 资源,然后单击 Headers 选项卡。这将向您显示如下内容:
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
需要注意的关键点是:
请求实际上是一个请求
对于 utm.gif,由
上面的第一行:*请求
网址:http://www.google-analytics.com/__utm.gif*。
Google Analytics 参数在查询字符串中清晰可见
附加到请求 URL:例如,
utmsr 是 GA 的变量名,用于引用客户端屏幕
对我来说,分辨率显示的值为
1280x800; utmfl 是变量
flash 版本的名称,它有一个
值 10.3 等。
响应头调用
Content-Type(由服务器发送回客户端)也确认
请求的资源和
返回的是一个 1x1 像素的 gif:
内容类型:图像/gif
这种在客户端和服务器之间传输数据的通用方案一直存在;很可能有更好的方法来做到这一点,但这是我所知道的唯一方法(满足托管分析服务施加的限制)。