GA跨域跟踪全揭秘

标签: GA 跨域跟踪 网页分析优化 | 发表时间:2011-06-12 15:23 | 作者:Cloga flogliu
出处:http://semwatch.org

什么是跨域跟踪?

跨域跟踪是指GA在多个域(包括子域与主域)跟踪访问者的访问行为。

为什么要进行跨域跟踪?

这个问题与cookie的path、domain属性以及GA的域哈希值有关。path及domain决定了cookie的可见性。GA的cookie默认情况下只能由设置的主域读写。虽然cookie可以在各子域间共享,但是,默认情况下,GA会为不同的子域指定不同的域哈希值,因此,子域之间的GA数据无法共享。
另外,通过设置path可以将cookie限制仅为该域或子域下的某个目录可读写。

因此,当我们需要在子域间共享GA数据时,需要统一各子域的域哈希值。而主域间是无法共享cookie的,想一想如果你在A网站的cookie保存了密码信息,而B网站可以读取这些cookie信息是多么可怕的事情,因此,cookie自身的安全设置就禁止了这样的共享。

PS:通过不同的domain和Path设置,在一个域可以存储多组GA的cookie。

如何进行跨主域的跟踪?

主要有两种方式:

一、借助于第三方cookie。比如广告投放过程中,先在第三方域的一个页面进行跳转,然后在第三方域上设置cookie,当访问者访问A网站及B网站时,都向第三方域发送信息,向第三方域发送请求时会在header中携带第三方域上的cookie。通过第三方域上的cookie信息就可以将访问者在A网站及B网站的行为统一起来。

AdWords的转化跟踪就是采用这种方式。用户在点击AdWords广告时会在Google的域下写入相关cookie,当用户发生转化时,会向google发送一个图片请求,这个请求会携带之前点击广告时写入的cookie信息,从而在转化与广告点击之间建立联系。

但是,随着访问者隐私意识的不断提升,禁用第三方cookie的比例不断提升,一些浏览器的默认设置就是禁用第三方cookie,从而降低了使用第三方cookie跟踪的准确性。

二、使用第一方cookie,通过在几个主域间跳转的URL添加参数传递cookie信息。这是GA跨域跟踪采用的方式。也是本文下面将要介绍的主要内容。

如何使用GA进行跨域跟踪?

GA的跨域跟踪主要涉及到六个方法的使用。

1. _setDomainName

这个方法用来控制GA的cookie(__utma、__utmb、__utmc、__utmz等)的domain属性及域哈希值。默认情况下,GA使用主域作为domain的值,通过这个方法,可以传递一个参数指定domain的值。主要有两种用法,一种是跨子域跟踪时,将主域作为参数传入,可以在各子域间共用一个域哈希值;一种是关闭跨子域跟踪时,可以传入一个none,这样GA会将cookie的domain设置为子域,从而将各子域作为独立主体跟踪,且不会影响主域的GA cookie。

2._setAllowHash

这个方法用来控制域哈希值,有一个参数,其值为布尔值,默认值为true,开启域哈希值,设置为false则会将域哈希值设置为1,关闭域哈希值。

3. _setAllowLinker

这个方法用来开启或关闭通过链接接受和传递cookie。只有一个参数布尔值,默认状态下为false,关闭通过链接接受和传递cookie;当需要跨主域跟踪时,才需要开启,设置为true。开启后必须与_link或_linkByPost一起使用。

4. _link

这个方法用在需要通过链接参数传递cookie的出站a标签上。有两个参数,第一个为URL,第二个为是否使用#传递cookie参数,此参数可选。

5. _linkByPost

这个方法通过将一个字符串附加到引荐表单的操作值 (HTTP POST),从而将 Cookie 从引荐表单传递到字符串中包含的另一网站。在从一个网站到第三方购物车网站跟踪用户行为时通常使用此方法,但也可用于将 Cookie 数据发送到弹出式窗口或 iFrame 中的其他域。同样支持两个参数,第一个为表单对象,第二个为是否使用#传递cookie参数。

注:目前为止,很少遇到这种类型的跨域,因此,以下内容不包括_linkByPost方法的使用及通过表单跨域。

6. _setCookiePath

这个方法可以将GA cookie的读写仅限于该域下的某个子目录。

常用的GA跨域跟踪情境及GA代码部署方式

了解了上面的基础知识,下面介绍一下常见的GA跨域跟踪情境及GA代码部署方式。

单一主域多个子域作为一个整体跟踪

这是最常见,同时也是最简单的跨域跟踪情境。根据上面的介绍,我们知道这种情况只是要在同一主域的不同子域间共享域哈希值。只需在_trackPageview方法前调用_setDomainName方法指定主域名。

GATC样例:

<script>

var _gaq = _gaq || [];

_gaq.push(['_setAccount','GA网络资源ID']);

_gaq.push(['_setDomainName','你的主域']);

_gaq.push(['_addOrganic','baidu','word']);

_gaq.push(['_addOrganic','soso','w']);

_gaq.push(['_addOrganic','sogou','query']);

_gaq.push(['_trackPageview']);

_gaq.push(['_trackPageLoadTime']);

(function() {

var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;

ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);

})();

</script>

注:本文的GATC都是以异步代码为准。

单一主域多个子域,整个主域作为一个整体跟踪,各个子域也各自作为一个整体跟踪

这种情况与上面的情况相比还涉及到多跟踪器部署。因为,对于每一个页面需要部署两个GA跟踪器,一个是主域的跟踪器,一个是子域的跟踪器。

跟踪器在GATC中用来标识GA账户的对象,异步代码的默认情况下,GA会使用一个名称为空的对象来标识GA账户。

这里的一个技巧是一个域不考虑path的情况下,只能存在两组GA cookie。一组是主域的cookie,一组是子域的cookie。

一个跟踪器使用_setDomainName(‘none’);,这个跟踪器会将cookie限制在子域,用于跟踪子域的流量,另一个跟踪器则调用_setDomainName(‘你的主域’),这个跟踪器使用的是主域的cookie,用于跟踪整个主域的流量。

GATC样例如下:

<script>

var _gaq = _gaq || [];

_gaq.push(['_setAccount', '子域的网络资源ID']);

_gaq.push(['_setDomainName','none']);

_gaq.push(['_addOrganic','baidu','word']);

_gaq.push(['_addOrganic','soso','w']);

_gaq.push(['_addOrganic','sogou','query']);

_gaq.push(['_trackPageview']);

_gaq.push(['_trackPageLoadTime']);

_gaq.push(['t2._setAccount', '主域的网络资源ID']);

_gaq.push(['t2._setDomainName','你的主域']);

_gaq.push(['t2._addOrganic','baidu','word']);

_gaq.push(['t2._addOrganic','soso','w']);

_gaq.push(['t2._addOrganic','sogou','query']);

_gaq.push(['t2._trackPageview']);

_gaq.push(['t2._trackPageLoadTime']);

(function() {

var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;

ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);

})();

</script>

注:部署多跟踪器时,需要注意,对于其他的一些自定义GATC,比如事件跟踪、自定义变量、电子商务也都需要指明跟踪器。如果这些数据是两个跟踪器所在的GA账户都需要的,则需要针对每一个跟踪器添加一次。

单一主域多个子域,整个主域作为一个整体跟踪,各个子目录也各自作为一个整体跟踪

这种情形与上面的情形类似,所不同的就是添加_setCookiePath指定cookie所属的目录。GATC样例如下:

<script>

var _gaq = _gaq || [];

_gaq.push(['_setAccount', '子目录的网络资源ID ']);

_gaq.push(['_setDomainName','none']);

_gaq.push(['_setCookiePath', '/子目录名称/']);

_gaq.push(['_addOrganic','baidu','word']);

_gaq.push(['_addOrganic','soso','w']);

_gaq.push(['_addOrganic','sogou','query']);

_gaq.push(['_trackPageview']);

_gaq.push(['_trackPageLoadTime']);

_gaq.push(['t2._setAccount', '主域的网络资源ID ']);

_gaq.push(['t2._setDomainName','你的主域']);

_gaq.push(['t2._addOrganic','baidu','word']);

_gaq.push(['t2._addOrganic','soso','w']);

_gaq.push(['t2._addOrganic','sogou','query']);

_gaq.push(['t2._trackPageview']);

_gaq.push(['t2._trackPageLoadTime']);

(function() {

var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;

ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);

})();

</script>

多个主域作为一个整体跟踪

跨主域跟踪才是GA中较复杂的情况,除了需要在GATC中作出修改,还需要在跨域的链接及表单上作出对应的修改。

首先,需要调用_setDomainName(‘主域名’)及_setAllowHash(false)将域哈希值关闭。这里没有使用_setDomainName(‘none’)的原因是_setDomainName(‘none’)会将GA cookie的Domain属性设置子域,这样的话,会将情况变得更复杂,我们需要在各个子域之间的跳转链接传递cookie。

其次,需要调用_setAllowLinker(true),开启通过URL参数接受和传递cookie值。

最后,也是最复杂的,在每个出站链接上调用_link方法。

GATC样例如下:

<script>

var _gaq = _gaq || [];

_gaq.push(['_setAccount', '总的网络资源ID ']);

_gaq.push(['_setDomainName','网站主域']);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_setAllowHash', false]);

_gaq.push(['_addOrganic','baidu','word']);

_gaq.push(['_addOrganic','soso','w']);

_gaq.push(['_addOrganic','sogou','query']);

_gaq.push(['_trackPageview']);

_gaq.push(['_trackPageLoadTime']);

(function() {

var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;

ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);

})();

</script>

主域间跳转链接的_link方法使用样例:

<a href=”http://example.com/test.html”

onclick=”_gaq.push(['_link', 'http://example.com/test.html']); return false;”>click me</a>

手动在每个主域间跳转的链接上添加_link方法几乎是不可能完成的任务。可以利用下面的JS遍历a标签,在主域间跳转的链接上添加_link方法。

<script>

var oldwhandler=window.onload

window.onload =function whandler () {

if (!!oldwhandler){oldwhandler()};

var links = document.getElementsByTagName(‘a’);

for (var x=0; x < links.length; x++) {

var oldlhandler=links[x].onclick

links[x].onclick = function () {

if (!!oldlhandler){oldlhandler()};

var mydomain = new RegExp(‘你的主域名’, ‘i’);//不包括.com、.cn等后缀

if(!mydomain.test(this.getAttribute(‘href’))) {

_gaq.push(['_link', this.getAttribute("href")]);return false;

}

};

}

}

</script>

注:这里需要注意的是,这段JS必须在页面完全加载后才会执行,因此,当访问者在页面没有加载完成前点击跨主域的链接,会导致跨域跟踪失败。

多个带有子域的主域,每个主域作为一个整体跟踪,且多个主域作为统一的整体跟踪

这种跨主域跟踪是更复杂的情况。除了上面的设置外,还涉及到多跟踪器。

GATC样例:

<script>

var _gaq = _gaq || [];

_gaq.push(['_setAccount', '具体主域的网络资源ID ']);

_gaq.push(['_setDomainName','网站主域']);

_gaq.push(['_setAllowHash', false]);

_gaq.push(['_setAllowLinker', true]);

_gaq.push(['_addOrganic','baidu','word']);

_gaq.push(['_addOrganic','soso','w']);

_gaq.push(['_addOrganic','sogou','query']);

_gaq.push(['_trackPageview']);

_gaq.push(['_trackPageLoadTime']);

_gaq.push(['t2._setAccount', '总的网络资源ID ']);

_gaq.push(['t2._setDomainName','网站主域']);

_gaq.push(['t2._setAllowHash', false]);

_gaq.push(['t2._setAllowLinker', true]);

_gaq.push(['t2._addOrganic','baidu','word']);

_gaq.push(['t2._addOrganic','soso','w']);

_gaq.push(['t2._addOrganic','sogou','query']);

_gaq.push(['t2._trackPageview']);

_gaq.push(['t2._trackPageLoadTime']);

(function() {

var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;

ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);

})();

</script>

好了,GA跨域跟踪的介绍就到这里,如果您有更好的跟踪方案或者有什么问题欢迎给我留言~

您可能也喜欢:

聊聊监测跟踪工具

如何克服 Web 分析的 11 大障碍

SEM优化:一个营销指标设置的练习 (续)

SEM优化:一个营销指标设置的练习
无觅

相关 [ga 跟踪 揭秘] 推荐:

GA跨域跟踪全揭秘

- flogliu - SEM WATCH
跨域跟踪是指GA在多个域(包括子域与主域)跟踪访问者的访问行为. 这个问题与cookie的path、domain属性以及GA的域哈希值有关. path及domain决定了cookie的可见性. GA的cookie默认情况下只能由设置的主域读写. 虽然cookie可以在各子域间共享,但是,默认情况下,GA会为不同的子域指定不同的域哈希值,因此,子域之间的GA数据无法共享.

GA小技巧:使用jQuery来方便的布置事件跟踪代码

- - 标点符
Google Analytics的事件跟踪是个神器,基本上你能想到什么他就能帮你做什么. 但是按照Google Analytics的帮助文章中方法去布置可能会让你觉得麻烦. 以下为我使用的小技巧分享给大家. 如果你需要跟踪某几个链接在页面上的点击数. 事先给需要记录的点击链接上添加一个类. 跟踪地址.

MySQL 5.6 GA 及逃亡潮

- - LinuxTOY
今日,Oracle 公司宣布 MySQL 5.6 GA,正式版为 5.6.10. MySQL 5.6.10 GA 主要是修复了之前 RC 版本中的 Bug. MySQL 5.6 新增特性有:. 改进的 InnoDB 存储引擎,增加全文索引能力. 同步复制功能增强,引入多线程复制特性. 引入 NoSQL 特性,可直接使用 Memcached API 操作 InnoDB 数据.

Spring Framework 3.2 GA 发布

- - 开源中国社区最新新闻
Spring Framework 3.2 GA 版本正式发布. Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架. 与 RC2 版本比较,该版本主要改进包括:. * 升级 Spring 框架构建到 AspectJ 1.7.1, JUnit 4.11, Groovy 1.8.8, JRuby 1.6.5, Joda-Time 2.1.

Spring Framework 3.2 GA版发布,Spring MVC焕然一新

- - InfoQ cn
近日,VMware的SpringSource团队 发布了Spring Framework 3.2 GA版,距3.1版的发布时间刚好是一年. 此次发布重点介绍了 Spring MVC Web框架,该框架最近在我们 JVM Web框架研究中名列前茅,其新特性如下所示:. 基于Servlet 3.0的异步MVC处理,Spring MVC处理器方法可以返回Callables与DeferredResults.

转载:Alpha、Beta、RC、GA版本的区别

- - Java - 编程语言 - ITeye博客
原文地址:http://www.blogjava.net/RomulusW/archive/2008/05/04/197985.html. Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用. Beta:也是测试版,这个阶段的版本会一直加入新的功能. RC:(Release Candidate) 顾名思义么.

.ML、.CF、.GA、.TK四大顶级域名免费注册

- -
.ML、.CF和.GA 这三个免费顶级域名要开放注册的消息其实在前几月大家就已经知道了,. 一直以来顶级域名中称得上真正免费的只有.TK,但当我看到一下子增加了.ML、.CF和.GA三个免费域名,. 突然觉得CO.VU这样的免费二级域名要弱掉了. ML域名是非洲国家马里的后缀,.CF域名中非共和国的后缀,.GA域名则是加蓬共和国的后缀,这三个域名都已经交给第三方的域名运营商来管理,现在是域名抢注期,.

MySQL数据库开源软件版本 生产环境GA版本如何选择

- - MySQLOPS 数据库与运维自动化技术分享
很多技术朋友向我咨询过关于选择MySQL数据库软件产品的版本事宜,他们对于开源软件产品的版本选择没有头绪,不知道从何下手. 不过,我们本文主要是介绍开源数据库产品的版本如何选择,如何选择生产环境的MySQL数据库版本. MySQL数据库版本的选择需要经过那些工序. 顺道分享下我们DBA团队是如何为生产环境,选择合适的MySQL数据库版本.

Servlet – 会话跟踪

- - ImportNew
HTTP本身是 “无状态”协议,它不保存连接交互信息,一次响应完成之后即连接断开,下一次请求需要重新建立连接,服务器不记录上次连接的内容.因此如果判断两次连接是否是同一用户, 就需要使用 会话跟踪技术来解决.常见的会话跟踪技术有如下几种:. URL重写: 在URL结尾附加. 会话ID标识,服务器通过会话ID识别不同用户..

开源跟踪软件 Prey

- bin - 开源中国社区最新软件
Prey 可让你全时跟踪你的电话和笔记本,如果它丢了或者被偷了,可以帮你找到它们.