子域和根域同名cookie的处理

PHP处理COOKIE是一件很方便的事情。print_r($_COOKIE)就可以打印所有的cookie变量。而且cookie也能够存为数组。确实操作和应用都非常方便 。

以前,对于子域和根域下的cookie并没有研究太深。因为都直接设在根域的。以前注意cookie是路径(path),这个的影响也是有的。不过现在大多数程序的cookie都是设在根路径(“/”)下,所以也回避了不少问题。

以下是老王提出的问题和解决方法(子域和根域同名cookie的处理),引伸开的话,你也可以测试一下,根路径与子路径下同名cookie的情况。【果然,老王文章结尾就是这样的提问,呵呵】

我们都知道,在子域下请求时,浏览器会把子域和根域下的Cookie一起发送到服务器,那如果子域和根域下有一个同名Cookie,当我们在PHP里使 用$_COOKIE访问时,到底生效的是哪个呢?下面做试验测试一下,测试使用Firefox,用到了以下插件:SwitchHosts+WebDeveloper+Firebug

注意:试验结果可能因为浏览器的不同而存在差异。

首先通过SwitchHosts设定虚拟域名:www.foo.com,并且配置好Web服务器,当然,你手动设置Hosts文件也可以,我本意是为了多介绍几个工具。

然后编写设置Cookie的PHP脚本,先设置子域,再设置根域:

PHP代码

  1. <?php  
  2. setcookie("bar""www", time() + 10, "/""www.foo.com");  
  3. setcookie("bar""foo", time() + 10, "/"".foo.com");  
  4. ?>  

再编写浏览Cookie的脚本:

PHP代码

  1. <?php  
  2. var_dump($_COOKIE);  
  3. ?>  

BTW:最初写脚本的时候我竟然在setcookie前使用了var_dump,也就是在发送请求头之前有了输出,犯了这样的初学者错误实在是罪过,可更令人惊讶的是脚本没有报错,查了半天原来是因为php.ini里缺省output_buffering = 4096。

先设置再浏览,就能看到结果了,结果显示有效的是子域下的Cookie。

重开一个浏览器窗口,并使用WebDeveloper删除Cookie,或手动删除,避免对结果造成影响。

然后调换两次调用setcookie的顺序,也就是先设置根域,再设置子域:

PHP代码

  1. <?php  
  2. setcookie("bar""foo", time() + 10, "/"".foo.com");  
  3. setcookie("bar""www", time() + 10, "/""www.foo.com");  
  4. ?>  

先设置再浏览,就能看到结果了,结果显示有效的是根域下的Cookie。

重复两次测试过程,并用Firebug记录下请求头的差异:

第一次先设置子域,再设置根域:请求头Cookie的值是bar=www;bar=foo,结果有效的是bar=www
第二次先设置根域,再设置子域:请求头Cookie的值是bar=foo;bar=www,结果有效的是bar=foo

也就说,同名Cookie对于服务端PHP来说,在请求头Cookie中,哪个在前哪个生效,后面的会被忽略。

如果使用的不是Firefox,那就用不了Firebug,此时可以用PHP代码来检测Cookie头:

PHP代码

  1. if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']);  


以上的实验结论是基于Firefox而言的,由于不同的浏览器发送Cookie的策略可能有差异,所以在其他浏览器上结果可能会有所不同,比如在 Safari下就始终是子域有效,其他浏览器如Opera,Chrome等未仔细测试。鉴于这个混乱的结论,所以还是不要在子域和根域下使用同名 Cookie为好!

转载于:https://my.oschina.net/shunshun/blog/1921577

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值