Cookie 域名相关
cookie无法设置除当前域名或者其父域名之外的其他domain.
这个是浏览器出于对cookie的保护造成的,也就是cookie无法跨域设置。
对于子域名也有如下规则,当前域名只能设置当前域名以及他的父域名,不能设置子域名,如在 www.wo.cao.baidu.com 域名下只能设置 cao.baidu.com, baidu.com 不能设置 da.jia.wo.cao.baidu.com 的 cookie。
cookie 参数详解
js设置cookie
document.cookie
- String
document.cookie = 'user=currentUser;expire=36000;path=/;domain=www.test.wangsd.com'
cookie参数
| 参数 Param | 类型 Type | 是否必填 Required | 描述 Description |
| :---- | :---- | :---- |
| name | String | 必需 | 规定 cookie 的名称 |
| value | Any(String) | 必需 | 规定 cookie 的值 |
| expire | Integer(毫秒) | 可选 | 规定 cookie 的有效期 |
| path | String | 可选 | 规定 cookie 的服务器路径 |
| domain | String | 可选 | 规定 cookie 的域名 |
| secure | [0,1] | 可选 | 规定是否通过安全的 HTTPS 连接来传输 cookie |
-
第一个:name,必选参数,这个是cookie的变量名
-
第二:value,可选参数,这个cookie变量的值
-
第三个:expire,可选参数,这个是用来设置cookie变量保存的时间,注意是我们设置的的UNIX时间戳减去当前的UNIX时间戳才是cookie变量保存的时间。(UNIX时间戳:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数),一般我们可以通过time()函数获取当前的UNIX时间戳,再加上我们要保存的时间(单位为秒)比如说,setcookie(“user”,”php”,time()+3600),这样我们就可以保存user这个cookie变量的时间为3600秒。另外我们可以通过设置的时间戳小于当前的时间戳来删除cookie变量,比如说setcookie(“user”,”php”,time()-1)这样我们就删除了user这个cookie变量了。
-
第四个:path,cookie的有效范围,这个参数是下一个参数domain基础上的有效范围,如果path设置为”/”,那就是在整个domain都有效,比如setcookie(“user”,”php”,time()+3600,”/”),这样我们domain下的任何目录,任何文件都可以通过 C O O K I E [ ′ u s e r ′ ] 来 调 用 这 个 c o o k i e 变 量 的 值 。 如 果 p a t h 设 置 为 ” / t e s t ” , 那 么 只 在 d o m a i n 下 的 / t e s t 目 录 及 子 目 录 才 有 效 , 比 如 d o m a i n 下 有 两 个 目 录 : t e s t 1 , t e s t 2 , 我 们 设 置 为 s e t c o o k i e ( “ u s e r ” , ” p h p , t i m e ( ) + 3600 , ” / t e s t 1 ″ ) , 那 么 只 有 t e s t 1 目 录 下 才 能 通 过 _COOKIE['user']来调用这个cookie变量的值。如果path设置为”/test”,那么只在domain下的/test目录及子目录才有效,比如domain下有两个目录:test1,test2,我们设置为setcookie(“user”,”php,time()+3600,”/test1″),那么只有test1目录下才能通过 COOKIE[′user′]来调用这个cookie变量的值。如果path设置为”/test”,那么只在domain下的/test目录及子目录才有效,比如domain下有两个目录:test1,test2,我们设置为setcookie(“user”,”php,time()+3600,”/test1″),那么只有test1目录下才能通过_COOKIE[‘user’]调用user这个cookie变量的值,test2目录下获取不到。
-
第五个:domain,cookie有效的域名,如果domain,设置为googlephp.cn,那么在googlephp.cn下的所有子域都有效。假设googlephp.cn有两个子域,php.googlephp.cn,css.googlephp.cn,我们设置为setcookie(“user”,”php”,time()+3600,”/”,”php.googlephp.cn”),那么只有在php.googlephp.cn这个子域下才能获取user这个cookie变量的值.再举一个例子:setcookie(“user”,”php”,time()+3600,”/test”,”php.googlephp.cn”),那么只有在php.googlephp.cn这个子域下的test目录下才能获取user这个cookie变量的值.
-
第六个:secure,值cookie是否仅通过安全的https,值为0或1,如果值为1,则cookie只能在https连接上有效,默认值为0,表示cookei在http和https连接上都有效。
cookie domain 域名设置详解
现在有如下3个域名,一个顶级域名、一个二级域名和一个三级域名:
- zydya.com
- blog.zyday.com
- one.blog.zyday.com
√ 表示该域名下能取到cookie,×表示不能取到cookie
1.首先在zyday.com
域名下设置cookie,做四次测试,分别设置domain参数为空、‘zyday.com’、‘blog.zyday.com’与’one.blog.zyday.com’。
domain参数 | zydya.com | blog.zyday.com | one.blog.zyday.com |
---|---|---|---|
setcookie(‘name’,1,time()+1) | √ | √ | √ |
setcookie(‘name’,1,time()+1,’/’,‘zyday.com’) | √ | √ | √ |
setcookie(‘name’,1,time()+1,’/’,‘blog.zyday.com’) | × | × | × |
setcookie(‘name’,1,time()+1,’/’,‘one.blog.zyday.com’) | × | × | × |
当domain设置为空时,domain默认为当前域名,并且该域名下的子域名都可以接收到cookie。
但是domain参数设置其子域名时,所有域名就接收不到了,包括那个子域名。
2.然后在blog.zyday.com
域名下设置cookie,测试条件同上
domain参数 | zydya.com | blog.zyday.com | one.blog.zyday.com |
---|---|---|---|
setcookie(‘name’,1,time()+1) | × | √ | √ |
setcookie(‘name’,1,time()+1,’/’,‘zyday.com’) | √ | √ | √ |
setcookie(‘name’,1,time()+1,’/’,‘blog.zyday.com’) | × | √ | √ |
setcookie(‘name’,1,time()+1,’/’,one.blog.zyday.com’) | × | × | × |
看第二行,domain参数是zyday.com,是blog.zyday.com的父域名,那么zyday.com下所有子域名(包括zyday.com、blog.zyday.com、one.blog.zyday.com)都能接收到cookie。
当domain为自身域名时,那么其父域名受影响,其本身与其子域名可以接收到cookie。
而设置其子域名或其他域名时,所有域名都接收不到cookie了。
3.最后在one.blog.zyday.com
域名下设置cookie
domain参数 | zydya.com | blog.zyday.com | one.blog.zyday.com |
---|---|---|---|
setcookie(‘name’,1,time()+1) | × | × | √ |
setcookie(‘name’,1,time()+1,’/’,‘zyday.com’) | √ | √ | √ |
setcookie(‘name’,1,time()+1,’/’,‘blog.zyday.com’) | × | √ | √ |
setcookie(‘name’,1,time()+1,’/’,one.blog.zyday.com’) | × | × | √ |
总结: 可以获取当前域的父域下的cookie,并在父域设置cookie,但是不能获取当前域名子域的cookie,也不能在子域设置cookie。