1

我在我们的一个 Web 应用程序中使用不同的分析标签。他们中的大多数人调用 javascript 代码进行跟踪。

一些标签有带有查询字符串的 gif 图像的 url。

示例:http ://www.google-analytics.com/__utm.gif?utmwv=45.542

这个网址到底是做什么的?他们如何从查询字符串中获取值?

更新:(阅读一些答案后)我知道每个浏览器都会加载 1x1 像素的 gif。但是他们如何从查询字符串中获取值?在上述情况下,他们如何检索 utmwv 的值?任何代码示例?

4

7 回答 7

4

基本上,您使用首选语言编写脚本,并将该脚本映射到yourtrackingscript.gif。..jpg、png 甚至。

使用 http 处理程序在 asp.net 中完成了此操作。

该脚本像任何其他动态页面(aspnet、asp、php 等等)一样读取查询字符串,然后将其写入数据库或日志文件,或者执行任何您想要对其执行的操作。

然后适当地设置内容类型标题,例如“image/gif”,然后发回一个 1 像素的图像,或者你喜欢的任何其他大小的图像。

对于仅 1 像素的图像,我在十六进制编辑器中打开了 1 像素的 spacer.gif 类型图像,并将其硬编码为字节数组以作为响应发送出去,如果它被击中将节省一点 IO 开销很多,或者,您可以从磁盘或数据库中读取文件并将其发回。

这是电子邮件通讯中常用的技巧来跟踪打开率等。
通常最难的一点是当您没有足够的权限将 url 映射到共享机器上的脚本时,但您可以将其开发为正常的脚本/程序,然后在它工作后整理映射。

如果大多数现代浏览器发送正确的标头,则大多数现代浏览器会将 aspx 或 php (.etc...) url 作为图像响应,旧浏览器、浏览器保姆插件和电子邮件客户端是最棘手的。

于 2009-02-24T07:38:24.197 回答
1

就像您可以将查询字符串传递给 ASP.NET 页面一样,您实际上可以将查询字符串传递给任何 URL;如果您使用基于 MVC 的框架,如 ASP.NET MVC 或 Rails,则从这样的 URL 捕获参数很容易。然后,您所要做的就是返回一个 GIF 图像。

于 2009-02-24T06:50:18.757 回答
1

任何浏览器都会在他的 url 上加载图像,即使没有 javascript。当它这样做时,可以捕获来自客户端的查询字符串参数和请求标头以进行分析。因此,它允许在完全没有 javascript 的情况下捕获分析。

于 2009-02-24T06:54:39.060 回答
1

那不是 GIF,那是空间站(测试版)

换句话说,虽然 URL 似乎指向一个图像,但 www.google-analytics.com 上的网络服务器将此请求交给一些处理脚本,然后提取数据并将 1x1 GIF 图像内容发送回浏览器。

这是一个使用 Apache 网络服务器和 mod_rewrite 的示例:

# in .htaccess
RewriteEngine On
RewriteRule ^__utm\.gif /someprocessingscript.php [QSA]

<?php // in someprocessingscript.php
do_some_tracking($_GET); // this would probably analyze and log data
header('Content-Type: image/gif');
readfile('1x1.gif');
exit;
?>

另一种选择:提供真正的 GIF(可能带有Cache-Control: no-cache),记录所有访问,然后分析日志。这可能会更快,因为这不需要内部重写,也不需要在每次访问时编写脚本。

于 2009-02-24T08:21:55.950 回答
0

当您请求图像时,查询字符串仍会发送到服务器。

当然,我不知道他们如何处理服务器上的数据的确切细节,但 .gif 是一种相当常见的将数据发回用于分析目的的方式。

于 2009-02-24T06:49:54.030 回答
0

好吧.. __utm.gif 是一个 1x1 像素的图像,谷歌必须记录访问 - 这意味着他们也在他们的日志中收集查询字符串值。真的没有什么棘手的。我认为 utmwv 是一个版本号,但不清楚该数字的含义

于 2009-02-24T06:52:45.600 回答
0

但是他们如何从查询字符串中获取值?在上述情况下,他们如何检索 utmwv 的值?任何代码示例?

如果他们想要调用页面,他们有引用者,如果他们想要他们的参数,他们有请求 URI。

print($_SERVER['HTTP_REFERER']);
print($_SERVER['REQUEST_URI']);
于 2009-02-24T08:36:31.950 回答