setcookie($name, $value, $expire, $path, $domain, $secure, $httponly)
$expire
:过期时间,默认为 0,即会话结束时过期(也就是关闭浏览器)
$domain
:Cookie 的有效域名(默认为空[自身],浏览器有跨域限制,可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则 Cookie 不起作用)
$_COOKIE['name']
如果 Cookie不存在,会有一个 Notice,取值前可以先用 isset 判断。
setcookie('name','123',1); // 示例1
setcookie('name','123',time()-3600); // 示例2
即把过期时间设置为一个过去的时间,浏览器会自动删除该 Cookie。
setcookie 的 $domain 参数决定了 Cookie 的作用域,下面详细讨论一下。
现在有三个域名,一个一级域名,一个二级域名,一个三级域名:
niu.com
bbs.niu.com
img.bbs.niu.com
在 niu.com
域名下设置 Cookie,$domain 参数依次设置为空。
√
表示该域名下能获取到 Cookie,×
表示不能获取到 Cookie
domain 参数 | niu.com | bbs.niu.com | img.bbs.niu.com |
---|---|---|---|
setcookie('name', 1, time() + 3600) | √ | √ | √ |
setcookie('name', 1, time() + 3600, '', 'niu.com') | √ | √ | √ |
setcookie('name', 1, time() + 3600, '', 'bbs.niu.com') | × | × | × |
setcookie('name', 1, time() + 3600, '', 'img.bbs.niu.com') | × | × | × |
在 bbs.niu.com
域名下设置 Cookie,$domain 参数依次设置为空。
√
表示该域名下能获取到 Cookie,×
表示不能获取到 Cookie
domain 参数 | niu.com | bbs.niu.com | img.bbs.niu.com |
---|---|---|---|
setcookie('name', 1, time() + 3600) | × | √ | √ |
setcookie('name', 1, time() + 3600, '', 'niu.com') | √ | √ | √ |
setcookie('name', 1, time() + 3600, '', 'bbs.niu.com') | × | √ | √ |
setcookie('name', 1, time() + 3600, '', 'img.bbs.niu.com') | × | × | × |
在 img.bbs.niu.com
域名下设置 Cookie,$domain 参数依次设置为空。
√
表示该域名下能获取到 Cookie,×
表示不能获取到 Cookie。
domain 参数 | niu.com | bbs.niu.com | img.bbs.niu.com |
---|---|---|---|
setcookie('name', 1, time() + 3600) | × | × | √ |
setcookie('name', 1, time() + 3600, '', 'niu.com') | √ | √ | √ |
setcookie('name', 1, time() + 3600, '', 'bbs.niu.com') | × | √ | √ |
setcookie('name', 1, time() + 3600, '', 'img.bbs.niu.com') | × | × | √ |
setcookie('name', 'value', time() + 3600, '', 'niu.com');
niu.com
和 .niu.com
是一样的,在浏览器中 $domain 存储的形式为 .niu.com
。
结论:
$domain 参数的设置,要注意两点:
在 setcookie 中省略 $domain,$domain 默认为当前域名;
$domain 可以设置为父域名及自身,但不能设置为其他域名,包括子域名,否则 Cookie 不起作用。
Cookie 的作用域:$domain 本身及其下的所有子域名。