php的超全局变量$_cookie带来了很多便利,在某些情况下也会造成困惑。比如在根域和子域下存在同名cookie,$_cookie中只能保存一个,应该是哪个?
rfc建议使用长度最长的那个,这样精度最高,但是不同浏览器处理方式不同。我只测试了chrome,chrome中根域和子域的同名cookie都发送出去了,这样php只接收排在前面的同名cookie,后面的被忽略,这样很容易接收到错误的值。据说safari遵循了rfc的建议,没有亲自测试,其他浏览器也没有测试。
首先通过switchhosts设定虚拟域名:www.bkjia.c0m,并且配置好web服务器,当然,你手动设置hosts文件也可以,我本意是为了多介绍几个工具。
然后编写设置cookie的php脚本,先设置子域,再设置根域:
代码如下 复制代码
再编写浏览cookie的脚本:
代码如下 复制代码
btw:最初写脚本的时候我竟然在setcookie前使用了var_dump,也就是在发送请求头之前有了输出,犯了这样的初学者错误实在是罪过,可更令人惊讶的是脚本没有报错,查了半天原来是因为php.ini里缺省output_buffering = 4096。
先设置再浏览,就能看到结果了,结果显示有效的是子域下的cookie。
重开一个浏览器窗口,并使用webdeveloper删除cookie,或手动删除,避免对结果造成影响。
然后调换两次调用setcookie的顺序,也就是先设置根域,再设置子域:
代码如下 复制代码
先设置再浏览,就能看到结果了,结果显示有效的是根域下的cookie。
重复两次测试过程,并用firebug记录下请求头的差异:
第一次先设置子域,再设置根域:请求头cookie的值是bar=www;bar=foo,结果有效的是bar=www
第二次先设置根域,再设置子域:请求头cookie的值是bar=foo;bar=www,结果有效的是bar=foo
也就说,同名cookie对于服务端php来说,在请求头cookie中,哪个在前哪个生效,后面的会被忽略。
如果使用的不是firefox,那就用不了firebug,此时可以用php代码来检测cookie头:
代码如下 复制代码
if (isset($_server['http_cookie'])) var_dump($_server['http_cookie']);
以上的实验结论是基于firefox而言的,由于不同的浏览器发送cookie的策略可能有差异,所以在其他浏览器上结果可能会有所不同,比如在safari下就始终是子域有效,其他浏览器如opera,chrome等未仔细测试。鉴于这个混乱的结论,所以还是不要在子域和根域下使用同名cookie为好!
结论:目前在根域和子域中使用同名cookie是非常不明智的
http://www.bkjia.com/phpjc/633196.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/633196.htmltecharticle$_cookie是php中一个非常好用的东西,但是有时我们会碰到同域名下的不同子域名一样,这样就会存在只能保留一个cookie的问题,下面小编来给...
