为什么要提供1x1像素GIF(网络错误)数据呢?

时间:2011-07-10 01:00:45

标签: javascript html google-analytics

许多分析和跟踪工具正在请求1x1 GIF图像(Web错误,对用户不可见),以进行跨域事件存储/处理。

为什么要提供这个GIF图像呢?只是返回一些错误代码,例如 503 Service Temporary Unavailable 更高效 em>或空文件?

更新:为了更清楚,我问为什么在请求标头中已经发送所需的所有信息时提供GIF图像数据。 GIF图像本身不会返回任何有用的信息。

8 个答案:

答案 0 :(得分:65)

道格的答案非常全面;我以为我会添加一个额外的注释(根据OP的请求,不在我的评论中)

Doug的答案解释了为什么1x1像素信标用于它们的目的;我想我会概述一种潜在的替代方法,即使用HTTP状态代码204,无内容来获取响应,而不是发送图像主体。

  

204无内容

     

服务器已完成请求   但不需要返回   entity-body,可能想要返回   更新的元信息。响应   可能包括新的或更新的   形式的元信息   entity-headers,如果存在的话   应该与之相关联   要求的变体。

基本上,服务器接收请求,并决定不发送正文(在这种情况下,不发送图像)。但它回复了一个代码,通知代理人这是一个有意识的决定;基本上,它只是一个较短的回答肯定的方式。

来自Google's Page Speed documentation

  

一种流行的录制方式   异步方式的视图是   包含一个JavaScript代码段   目标页面的底部(或作为   onload事件处理程序),通知a   用户加载时记录服务器   页。最常见的做法   这是为了构建一个请求   用于“信标”的服务器,并对所有进行编码   感兴趣的数据作为参数   信标资源的URL。至   保持HTTP响应非常小,a   透明的1x1像素图像是一个很好的   信标请求的候选人。一个   稍微更优化的信标将使用   HTTP 204响应(“无内容”)   它略小于1x1   GIF。

我从来没有尝试过,但理论上它应该用于同一目的而不需要传输gif本身,在Google Analytics的情况下可以节省35个字节。 (在方案中,除非你的Google Analytics每天提供数万亿次点击,否则35个字节真的没什么。)

您可以使用以下代码进行测试:

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

答案 1 :(得分:54)

答案 2 :(得分:14)

如果资源无法加载,某些浏览器可能会显示错误图标。它使调试/监视服务也变得更复杂,您必须确保您的监视工具将错误视为一个好结果。

OTOH你没有获得任何东西。服务器/框架返回的错误消息通常比1x1映像大。这意味着您基本上不会增加​​网络流量。

答案 3 :(得分:8)

因为这样的GIF在浏览器中有一个已知的演示文稿 - 它是一个像素的句点。任何其他东西都存在视觉上干扰页面实际内容的风险。

HTTP错误可能会显示为超大错误文本框架,甚至可能显示为弹出窗口。如果某些浏览器收到空回复,也可能会抱怨。

此外,页内图像是所有broswers中默认允许的极少数数据类型之一。其他任何事情都可能需要明确的用户操作才能下载。

答案 4 :(得分:4)

这是为了回答OP的问题 - “为什么要提供GIF图像数据......”

有些用户会使用简单的 img 标记来调用您的事件记录服务 -

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

在这种情况下,如果您没有投放图片,浏览器会显示一个看似丑陋的占位符图标,并给人一种服务中断的印象!

我的工作是,查找接受标题字段。通过像这样的 img 标记调用脚本时,您会在请求的标题中看到类似的内容 -

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

接受标题字段中有“image / ”*字符串时,我提供图像,否则我只回复204.

答案 5 :(得分:1)

好主要原因是将cookie附加到它上面,所以如果用户从一边到另一边,我们仍然有相同的元素来附加cookie。

答案 6 :(得分:0)

如果使用Beacon API(https://w3c.github.io/beacon/)实现方法,则无需提供图像。

如果您有权访问服务器的日志文件,则错误代码将起作用。投放图片的目的是获得比常规日志文件更多的有关用户的数据。

答案 7 :(得分:0)

@MaciejPerliński基本上是正确的,但我认为详细的答案将是有益的。

为什么使用1x1 GIF而不是204 No-Content状态码?

204 No-Content使服务器可以省略所有响应标头(Content-Type,Content-Length,Content-Encoding,Cache-Control等...),并返回具有0个字节的空响应正文(并保存一个很多不必要的带宽)。

浏览器知道尊重204 No-Content的响应,并且不期望/等待响应头和响应正文。

如果服务器需要设置任何响应标头(例如cache-controlcookie),则他不能使用204 No-Content,因为浏览器将根据设计忽略任何响应标头(根据HTTP协议)规格)。

为什么使用1x1 GIF而不是带有Content-Length: 0状态代码的200 OK标头?

可能是几个问题的组合,仅举几例:

  • 旧版浏览器的兼容性
  • 在浏览器上检查MIME类型,0字节不是有效的图像。
  • 中间代理服务器和VPN可能不完全支持0个字节的
  • 200 OK