作为程序员一定要保持良好的睡眠,才能好编程

cookie在php中使用场景及异常

发布时间:2018-06-13

顾名思义,cookie是会话中的一种,我们在做一些用户登录时候,经常会用到一些会话的场景。

 

那么php中使用会话是如何使用的?

 

 

setcookie('cookiename','value',expire,path,domain);   设置cookie

 

cookie存在同一域名  同一目录 下只会存在一个。 这是结论。

 

如果同一个域名下存在两个同名cookie ,可能性有两种:  1、目录不同   2、domain不同

 

下面我们来看看 目录不同的场景:

 

php代码:domain localhost

setcookie('aa',123,time()+5000,'/test');

setcookie('aa',34433,time()+5000,'/');

 

在localhost 目录下 cookie.php  ,在test目录下也一个cookie.php

cookie.php

print_r($_COOKIE);

 

好,见证奇迹的时间到了:

 

test目录:

localhost_test.png

 

localhost目录:

localhost.png

 

问题来了:如果在 localhost/b目录下,是否能读到cookie呢?

localhostb.png

 

这说明了什么呢? 在同一个域名下,路径为 / 的话,可以在b 目录下出现

 

证明:路径为 / 的话,在子目录中可以读取到 aa  这个cookie 。

 

那么如果b目录下也存在 同名的cookie 那么读取本目录下的cookie

 

localhostb.png

 

 



我遇到的问题:


 

同一目录下,存在同名但domain不同(同一个域名的二级域名)的两个cookie。

 

同一目录下存在两个cookie的可能性:

 

 domain不同(同一个域名的二级域名) a.test.com  b.test.com

 

 在顶级域名下,设置cookie,那么domain有可能是   www.test.com 或者  test.com

 这两种方法都可以设置cookie,在主目录下都可以读取到,
 setcookie('cookiename','123',0,'','www.test.com');
 上面的这种写法,只有在www顶级域名下,才可以获取到。
 
 setcookie('cookiename','123');  
 默认设置到顶级域名下 根目录下 / 下面,这种写法 二级域名无法读取到cookie

 

 

顶级域名和二级域名如何共享cookie呢?

 

 setcookie('cookiename','wwwtest',0,'','test.com');

 setcookie('cookiename','wwwtest',0,'','.test.com');

 

testcookie.png

 

注意仔细看:域名为 .test.com

 

上面的这种写法,在顶级域名下设置成功后,在二级域名下是可以获取到cookie。

 

二级域名下获取cookie,测试看看:

testcookie2.png

 

可以明确的看到,已经获取到了。实现了顶级域名和二级域名的共享。

 

 

问题又来了,顶级域名设置的cookie 二级域名下可以改吗?

 

主域名下: 设置了cookie c
setcookie('c','wwwtest',0,'','test.com');


b.test.com 域名下修改cookie c

setcookie('c','wwwtest_update b.test.com',0,'','test.com');

 

 

 testcookie3.png

 

发现修改成功了。原因是  domain test.com 都是一样的。 这是一种情况



如果改成

 

setcookie('c','wwwtest_update b.test.com',0,'','www.test.com');

这是万万设置不成功的。 cookie限制不允许。

 

 

那么问题又来了,在

setcookie('c','wwwtest_update b.test.com',0,'');

 

这样的情况下,能否成功呢?  这是不成功的。

 

testcookie4.png

 

 

 

如果设置成 a.test.com 设置cookie是不生效的。

cookie.php 位于b.test.com 那么这样写: 不写domain(也就是不写域名)

 setcookie('c','wwwtest_update b.test.com',0,'');

cookie是可以写入成功,但是不能覆盖掉.test.com 域名下的cookie,依然存在,当读取php读取cookie时,从前面一个读取,因此我们看到的结果是:

 

testcookie5.png

 

 

恩,还是.test.com 域名下的cookie。

 

好的,现在移除.test.com 域名下的cookie c 那么会发生什么事情?

 

 testcookie6.png

 

可以看到,我们在b域名下设置的cookie已经生效了。可以正确读取。

 

 

 再一个问题:二级域名下是否可以指定域名进行设置cookie呢?

 setcookie('c','wwwtest_update b.test.com',0,'','test.com');

 

这是可以设置成功的,因为设置的主域名 都在 .test.com 下:

testcookie7.png

 

 

 恩,以上就是这几种cookie存在的环境。

 

 

 

兴趣所致,三级域名一个测试:

www.test.com/cookie.php 下设置一下cookie c

setcookie('c','wwwtest',0,'','test.com');

 

在d.b.test.com/cookie.php 下查看,是否存在呢?

testcookie8.png

 

 

在子域名下,cookie的设置,只要不是顶级域名就可以覆盖。

在d.b.test.com,可以使用以下设置:

 setcookie('c','wwwtest_update b.test.com',0,'','test.com'); 
 
 print_r($_COOKIE);
 
 
 setcookie('c','wwwtest_update b.test.com',0,'','b.test.com'); 
 
 也可以成功

 

获取的前后顺序是 先设置,先读取

 

例如:

 

www.test.com/cookie.php 设置了cookie

setcookie('c','wwwtest',0,'','test.com');

在 d.b.test.com/cookie.php 下获取cookie的同时,想修改一下c的值


setcookie('c','wwwtest_update b.test.com',0,'','b.test.com');
print_r($_COOKIE);

 testcookie9.png


php代码执行成功,但是获取还是.test.com 目录下的cookie。


那么再次设置一下:

setcookie('c','d.b.test.com',0,'','d.b.test.com');

 print_r($_COOKIE);


testcookie19.png



如果删除掉 .test.com 下的cookie c, 那么获取的就是  b.test.com 域名下的 cookie c  结果如下:

testcookie18.png



如果再次删除 .b.test.com 下的cookie c ,那么结果一定是 d.b.test.com 目录下的cookie c 的值:


d.b.test.com


testcookie17.png

 

 

 




顶级域名的cookie在顶级域名或者2级域名都可以删除,但是用非顶级域名访问的网站要删除顶级域名的cookie,需要设置获取到的cookie的domain为顶级域名,这样才能删除顶级域名的cookie,否则无法删除,默认的会删除访问的域名下对应的cookie,而不是顶级域名的。