前言

用户行为分析,最重要的一点就是通过埋点准确的获取用户的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. 专业PHP 7 IDE - Eclipse PDT 4.0 终于出世

    2016年6月22日,第一款开源免费的完整支持PHP 7版本的IDE - PDT 4终于发布.原本我是期望Netbeans 8.2的,但PDT 4.0 发布,就等不及了. PDT团队很高兴的宣布PDT ...

  2. 第 25 章 CSS3 过渡效果

    学习要点: 1.过渡简介 2.transition-property 3.transition-duration 4.transition-timing-function 5.transition-d ...

  3. 【转】ubuntu源码编译安装php常见错误解决办法

    ./configure -prefix=/usr/local/php -with-config-file-path=/etc -with-mysql=mysqlnd -with-mysqli=mysq ...

  4. wso2esb之代理服务 Proxy Services

    代理服务 顾名思义,代理服务充当了WSO2 ESB服务的代理,通常是一个已经存在的服务端点,代理服务可以使用不同的传输方式. 客户可以直接发送请求代理服务的ESB,客户看到服务代理. 运行示例 配置W ...

  5. Hibernate(三)__核心接口和类

    该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...

  6. [deviceone开发]-UI组件的动画示例

    一.简介 自定义组件模版(头部,按钮,加减数量,加载,底部弹出,开关(文字/无文字),选项卡(2-4), radio)全部带自定义动画效果,需从组件商店中添加:do_Animator组件 二.效果图 ...

  7. DOM中的事件处理概览与原理的全面剖析

    事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信,DOM支持大量的事件: 本文通过这几点向大家详细解析事件处理的基本原理:事件类型.事件目标.事件处理程序.事件对象.事件传播 最后再向 ...

  8. SAP中删除假脱机请求

    好几次公司的SAP都碰到所有的SMARTFORM都打印不了的情况.查了一下原因原来是假脱机请求太多了.清了一下,问题就解决了.    删除假脱机请求的一些方法:    1.避免经常出现此类错误,最好还 ...

  9. 劳动节脑洞大开!利用Debug API 获取 加壳客户端的MD5值

    系统 : Windows xp 程序 : 某游戏客户端 程序下载地址 :不提供 要求 : 远程注入 & 获取MD5值 使用工具 : vc++6.0 & OD 案例说明: 该游戏客户端对 ...

  10. CSAW2013

    竞赛地址:https://ctf.isis.poly.edu/challenges/ 第一关:Trivia Trivia意思为琐事,每题分值50,比较简单 1.Drink all the booze, ...