前言

用户行为分析,最重要的一点就是通过埋点准确的获取用户的Cookie,那么这个Cookie到底怎么设置呢?那么如果面对的是站群,用户Cookie又该怎么设置,才能让访客量和新访客量准确无误呢?

接下来我们先看一个例子,之前我们对www.haier.com 设置Cookie是这样的,

document.cookie=name=xxx1; expires=Tue, 10-Jul-2016 08:30:18 GMT; path=/

  那么这样,只能设置当前域的Cookie,后来发现海尔的二级域名很多(bbs.haier.com或者shangcheng.haier.com等等),需要将这些访问过的不同域名的访客统一起来,那么这样就涉及到重新设置Cookie的问题(设置到一级域名上)。那么设置Cookie又需要考虑不同浏览器的兼容性,所以我们改为

document.cookie=name=xxx1; expires=Tue, 10-Jul-2016 08:30:18 GMT; path=/; domain=.haier.com

  因为据我的考察,域名设置的域名前面都是带点的,所以目前就这样设置。但是这样的设置后,我们发现访客的数量还是比较多,应该是设置的浏览器兼容情况,所以这个问题就锁定在IE上了。在经过大量测试和资料查找,我们发现了一个名词----HostOnly Cookie。

什么是HostOnly Cookie

rfc6265第5.3节定义了浏览器存放每个Cookie时应该包括这些字段:name、value、expiry-time、domain、path、creation-time、last-access-time、persistent-flag,、host-only-flag、secure-only-flag和http-only-flag。

其中:

  • name、value:由Cookie正文指定;
  • expiry-time:根据Cookie中的expires和max-age产生;
  • domain、path:分别由Cookie中的domain和path指定;
  • creation-time、last-access-time:由浏览器自行获得;
  • persistent-flag:持久化标记,在expiry-time未知的情况下为false,表示这是个session cookie;
  • secure-only-flag:在Cookie中包含secure属性时为true,表示这个cookie仅在https环境下才能使用;
  • http-only-flag:在Cookie中包含httponly属性时为true,表示这个cookie不允许通过JS来读写;
  • host-only-flag:在Cookie中不包含Domain属性,或者Domain属性为空,或者Domain属性不合法(不等于页面url中的Domain部分、也不是页面Domain的大域)时为true。此时,我们把这个Cookie称之为HostOnly Cookie;

那么host-only-flag如果为true会怎样呢?rfc6265里有这么一段:

Either: The cookie's host-only-flag is true and the canonicalized request-host is identical to the cookie's domain.

Or:  The cookie's host-only-flag is false and the canonicalized request-host domain-matches the cookie's domain.

获取Cookie时,首先要检查Domain匹配性,其次才检查path、secure、httponly等属性的匹配性。如果host-only-flag为true时,只有当前域名与该Cookie的Domain属性完全相等才可以进入后续流程;host-only-flag为false时,符合域规则(domain-matches)的域名都可以进入后续流程。

举个例子,host-only-flag为true时,Domain属性为example.com的Cookie只有在example.com才有可能获取到;host-only-flag为false时,Domain属性为example.com的Cookie,在example.com、www.example.com、sub.example.com等等都可能获取到。

下面,我们来引用找到的资料所进行的覆盖测试;

Cookie覆盖测试

在www.qgy18.com,设置以下3条Cookie:

1、name=ququ1; expires=Tue, 10-Jul-2013 08:30:18 GMT; path=/
2、name=ququ2; expires=Tue, 10-Jul-2013 08:30:18 GMT; path=/; domain=.www.qgy18.com
3、name=ququ3; expires=Tue, 10-Jul-2013 08:30:18 GMT; path=/; domain=www.qgy18.com

访问www.qgy18.com,获取Cookie,结果如下:

浏览器 在www.qgy18.com获取到的Cookie
Chrome 29.0.1547.3 dev name=ququ1; name=ququ3
Firefox 22.0 name=ququ1; name=ququ3
Chrome 27.0.1453.116 m name=ququ1; name=ququ3
IE 6.0.2900.5512 name=ququ3
IE 10.0.9200.16438 name=ququ3
Opera 12.15(Presto内核,非Webkit) name=ququ3
iOS Safari 6.1.3 name=ququ3; name=ququ1
Safari 7.0 name=ququ3; name=ququ1

规范里有两点规定需要先说明下:

  1. 设置Cookie时,Domain属性值如果是.a.com,前面的.会被去掉,变成a.com(rfc6265第5.2.3节);
  2. 对于name、path和domain均相同的Cookie,后面的覆盖前面的(rfc6265第5.3节第10段);

由于IE系列不支持HostOnly Cookie,三个语句对于IE来说是完全一样的(1没有指定Domain,自动使用请求头中的Host或者页面url中的Domain部分作为Cookie的Domain属性,都是www.qgy18.com),后面覆盖前面,只剩下name=ququ3;

分歧出在Presto内核的Opera与Chrome、Safari和Firefox之间:Opera认为三个语句的name、path和domain均相同,产生了跟IE一样的结果;其它浏览器认为host-only-flag为true的Domain和其它两个不同,所以只有语句3可以覆盖2,剩下1和3;

最后的决定

看到了IE的情况,我们毅然决然的更改了代码,类似下面这样的设置,其实只去掉了一点,但是却会大有改变,伪代码如下:

document.cookie=name=xxx1; expires=Tue, 10-Jul-2016 08:30:18 GMT; path=/; domain=haier.com

这样的话,IE再遇到haier.com的情况就不会重新生成新的Cookie了。目前来看,访客的采集还是比较准确的。

感谢

感谢Jerry Qu提供的资料,具体详细资料见:https://imququ.com/post/host-only-cookie.html

通过HostOnly Cookie为Cookie正确的设置一级域名的更多相关文章

  1. JS设置Cookie,及COOKIE的限制

    在Javascript脚本里,一个cookie 实际就是一个字符串属性.当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值.每个cookie除了 name ...

  2. 设置二级域名共享一级域名Cookie和删除共享Cookie

     设置共享Cookie: 二级域名要想共享一级域名的cookie,只需要设置cookie.Domain = ".一级域名.com";   删除共享Cookie:  HttpCook ...

  3. Web.config文件中关于Cookie安全性的考量和设置

    cookie的内容,如图所示: HTTP response header: Set-Cookie: <name>=<value>[; <Max-Age>=<a ...

  4. 设置cookie,删除cookie,读取cookie

    1.首先来说下cookie的作用 我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面.我们经常会在此时设置30天内记住我,或者自动登录选项.那么它们是怎么记录信息的呢,答案就是今天的主 ...

  5. session,cookie,sessionStorage,localStorage的相关设置以及获取删除

    一.cookie 什么是 Cookie? "cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScrip ...

  6. 读取Cookie及Cookie所有属性操作方法

    读取Cookie及Cookie所有属性操作方法 2013-08-04 22:21:43|  分类: 技术 |  标签:cookie  |举报|字号 订阅   要把Cookie发送到客户端,Servle ...

  7. JS存储cookie读取cookie删除cookie详细用法

    假设有这样一种情况,在某个用例流程中,由A页面跳至B页面,若在A页面中采用JS用变量temp保存了某一变量的值,在B页面的时候,同样需要使用JS来引用temp的变量值,对于JS中的全局变量或者静态变量 ...

  8. asp.net,cookie,写cookie,取cookie

    Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...

  9. 读javascript高级程序设计17-在线检测,cookie,子cookie

    一.在线状态检测 开发离线应用时,往往在离线状态时把数据存在本地,而在联机状态时再把数据发送到服务器.html5提供了检测在线状态的方法:navigator.onLine和online/offline ...

随机推荐

  1. Android使用SQLite数据库(1)

    Android中使用SQLite数据库要通过SQLiteOpenHelper类. 首先,定义相关变量: // 数据库变量 DatabaseHelper mDBH; SQLiteDatabase db; ...

  2. ios跑酷游戏源码完整版

    今天在网上看到了一个很流行的ios游戏源码,酷跑游戏源码,个人下载感觉非常不错,运行起来非常不错的,大家可以研究一下吧,由于源码文件较大,没有上传,请大家见谅. 由于文件较大,没有上传了,大家可以到这 ...

  3. PHPUnit单元测试中类protected/private方法测试

    这里首先有一个问题要考虑的是,这类方法是否要被测试? 理论上,这类方法都会被其它public类型的方法调用,只要对那些public的方法做充分的测试,就可以保证这些方法的可靠性,就没有必要再测了.好像 ...

  4. 用Apache 里面的ab做一个简单的压力测试

    我用的是xampp环境包. D:\xampp\apache\bin 进入这路径, 找到ab.exe  尝试双击打开ab.exe 但不能如愿, 这两个都是一个压力的测试软件, 是apache自带的; 好 ...

  5. PHP内核探索之变量(4)- 数组操作

    上一节(PHP内核探索之变量(3)- hash table),我们已经知道,数组在PHP的底层实际上是HashTable(链接法解决冲突),本文将对最常用的函数系列-数组操作的相关函数做进一步的跟踪. ...

  6. Hibernate关联映射(单项多对一和一对多、双向一对多)

    最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...

  7. MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件

    MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...

  8. SlimerJS – Web开发人员可编写 JS 控制的浏览器

    SlimerJS 是一个提供给 Web 开发人员,可通过脚本编程控制的浏览器.它可以让你使用 Javascript 脚本操纵一个网页:打开一个网页,点击链接,修改的内容等,这对于做功能测试,页面自动机 ...

  9. Location对象、History对象

    Location对象: Window对象的location属性引用的是Location对象,它表示窗口中当前显示的内容的URL,Document对象的location属性也引用Location对象,w ...

  10. ionic + cordova 使用 cordova-gallery-api 获取本地相册所有图片

    cordova-gallery-api 插件定义一个全局galleryapi对象,提供查询图库相册的方法 安装 cordova-gallery-api: cordova plugin add http ...