许多分析和跟踪工具正在请求1x1 GIF图像(Web错误,对用户不可见),以进行跨域事件存储/处理。
为什么要提供这个GIF图像呢?只是返回一些错误代码,例如 503 Service Temporary Unavailable 更高效 em>或空文件?
更新:为了更清楚,我问为什么在请求标头中已经发送所需的所有信息时提供GIF图像数据。 GIF图像本身不会返回任何有用的信息。
答案 0 :(得分:65)
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-control
或cookie
),则他不能使用204 No-Content
,因为浏览器将根据设计忽略任何响应标头(根据HTTP协议)规格)。
为什么使用1x1 GIF而不是带有Content-Length: 0
状态代码的200 OK
标头?
可能是几个问题的组合,仅举几例:
200 OK