顾名思义,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目录:
问题来了:如果在 localhost/b目录下,是否能读到cookie呢?
这说明了什么呢? 在同一个域名下,路径为 / 的话,可以在b 目录下出现。
证明:路径为 / 的话,在子目录中可以读取到 aa 这个cookie 。
那么如果b目录下也存在 同名的cookie 那么读取本目录下的cookie
我遇到的问题:
同一目录下,存在同名但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');
注意仔细看:域名为 .test.com
上面的这种写法,在顶级域名下设置成功后,在二级域名下是可以获取到cookie。
二级域名下获取cookie,测试看看:
可以明确的看到,已经获取到了。实现了顶级域名和二级域名的共享。
问题又来了,顶级域名设置的cookie 二级域名下可以改吗?
主域名下: 设置了cookie c setcookie('c','wwwtest',0,'','test.com'); b.test.com 域名下修改cookie c setcookie('c','wwwtest_update b.test.com',0,'','test.com');
发现修改成功了。原因是 domain test.com 都是一样的。 这是一种情况
如果改成
setcookie('c','wwwtest_update b.test.com',0,'','www.test.com');
这是万万设置不成功的。 cookie限制不允许。
那么问题又来了,在
setcookie('c','wwwtest_update b.test.com',0,'');
这样的情况下,能否成功呢? 这是不成功的。
如果设置成 a.test.com 设置cookie是不生效的。
cookie.php 位于b.test.com 那么这样写: 不写domain(也就是不写域名)
setcookie('c','wwwtest_update b.test.com',0,'');
cookie是可以写入成功,但是不能覆盖掉.test.com 域名下的cookie,依然存在,当读取php读取cookie时,从前面一个读取,因此我们看到的结果是:
恩,还是.test.com 域名下的cookie。
好的,现在移除.test.com 域名下的cookie c 那么会发生什么事情?
可以看到,我们在b域名下设置的cookie已经生效了。可以正确读取。
再一个问题:二级域名下是否可以指定域名进行设置cookie呢?
setcookie('c','wwwtest_update b.test.com',0,'','test.com');
这是可以设置成功的,因为设置的主域名 都在 .test.com 下:
恩,以上就是这几种cookie存在的环境。
兴趣所致,三级域名一个测试:
在www.test.com/cookie.php 下设置一下cookie c
setcookie('c','wwwtest',0,'','test.com');
在d.b.test.com/cookie.php 下查看,是否存在呢?
在子域名下,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);
php代码执行成功,但是获取还是.test.com 目录下的cookie。
那么再次设置一下:
setcookie('c','d.b.test.com',0,'','d.b.test.com'); print_r($_COOKIE);
如果删除掉 .test.com 下的cookie c, 那么获取的就是 b.test.com 域名下的 cookie c 结果如下:
如果再次删除 .b.test.com 下的cookie c ,那么结果一定是 d.b.test.com 目录下的cookie c 的值:
d.b.test.com
顶级域名的cookie在顶级域名或者2级域名都可以删除,但是用非顶级域名访问的网站要删除顶级域名的cookie,需要设置获取到的cookie的domain为顶级域名,这样才能删除顶级域名的cookie,否则无法删除,默认的会删除访问的域名下对应的cookie,而不是顶级域名的。