PHP处理COOKIE是一件很方便的事情。print_r($_COOKIE)就能够打印全部的cookie变量。并且cookie也可以存为数组。确实操做和应用都很是方便 。php
之前,对于子域和根域下的cookie并无研究太深。由于都直接设在根域的。之前注意cookie是路径(path),这个的影响也是有的。不过如今大多数程序的cookie都是设在根路径(“/”)下,因此也回避了很多问题。数组
如下是老王提出的问题和解决方法(子域和根域同名cookie的处理),引申开的话,你也能够测试一下,根路径与子路径下同名cookie的状况。【果真,老王文章结尾就是这样的提问,呵呵】浏览器
咱们都知道,在子域下请求时,浏览器会把子域和根域下的Cookie一块儿发送到服务器,那若是子域和根域下有一个同名Cookie,当咱们在PHP里使 用$_COOKIE访问时,到底生效的是哪一个呢?下面作试验测试一下,测试使用Firefox,用到了如下插件:SwitchHosts+WebDeveloper+Firebug。
注意:试验结果可能由于浏览器的不一样而存在差别。
首先经过SwitchHosts设定虚拟域名:www.foo.com,而且配置好Web服务器,固然,你手动设置Hosts文件也能够,我本意是为了多介绍几个工具。
而后编写设置Cookie的PHP脚本,先设置子域,再设置根域:服务器
PHP代码cookie
再编写浏览Cookie的脚本:工具
PHP代码测试
BTW:最初写脚本的时候我居然在setcookie前使用了var_dump,也就是在发送请求头以前有了输出,犯了这样的初学者错误实在是罪过,可更使人惊讶的是脚本没有报错,查了半天原来是由于php.ini里缺省output_buffering = 4096。
先设置再浏览,就能看到结果了,结果显示有效的是子域下的Cookie。
重开一个浏览器窗口,并使用WebDeveloper删除Cookie,或手动删除,避免对结果形成影响。
而后调换两次调用setcookie的顺序,也就是先设置根域,再设置子域:spa
PHP代码firefox
先设置再浏览,就能看到结果了,结果显示有效的是根域下的Cookie。
重复两次测试过程,并用Firebug记录下请求头的差别:
第一次先设置子域,再设置根域:请求头Cookie的值是bar=www;bar=foo
,结果有效的是bar=www
第二次先设置根域,再设置子域:请求头Cookie的值是bar=foo;bar=www,结果
有效的是
bar=foo
插件
也就说,同名Cookie对于服务端PHP来讲,在请求头Cookie中,哪一个在前哪一个生效,后面的会被忽略。
若是使用的不是Firefox,那就用不了Firebug,此时能够用PHP代码来检测Cookie头:
PHP代码
if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']);
以上的实验结论是基于Firefox而言的,因为不一样的浏览器发送Cookie的策略可能有差别,因此在其余浏览器上结果可能会有所不一样,好比在 Safari下就始终是子域有效,其余浏览器如Opera,Chrome等未仔细测试。鉴于这个混乱的结论,因此仍是不要在子域和根域下使用同名 Cookie为好!