PHP setcookie()用于域但不是子域

时间:2009-09-13 15:14:54

标签: php cookies subdomain

有没有办法在子域名上设置可读的cookie?换句话说,请在domain.com上提供Cookie,但 www.domain.comxyz.domain.com

//this is what i'm "intending"...
setcookie($name,$value,$expires,'/','domain.com');
//however, this is how it behaves:
setcookie($name,$value,$expires,'/','.domain.com');

原因:我在子域上设置静态CDN,并且不希望用户会话cookie为每个图像,css文件,js文件等来回传递。

...我是否必须回归使用www.domain.com作为我的网站?有没有解决方法?

4 个答案:

答案 0 :(得分:17)

显然,在“domain.com”上设置一个与“* .domain.com”匹配的cookie是预期的行为。

例如:PERSISTENT CLIENT STATE HTTP COOKIES(某些强调我的)

  

<强> domain=DOMAIN_NAME

     

搜索Cookie列表时   有效的饼干,比较   cookie的域属性是   用互联网域名制作的   URL所在的主机   牵强。 ......“尾巴匹配”是指   该域属性是匹配的   完全靠尾巴   主机的合格域名。 :一种   “acme.com”的域属性会   将主机名“anvil.acme.com”匹配为   以及“shipping.crate.acme.com”

     

仅指定域内的主机   可以为域设置cookie   域必须至少两个(2)   或三(3)个期间   防止表单域:“。com”,   “.edu”和“va.us”。任何领域   在七个特别之一内失败   顶级域名仅在下面列出   需要两个时期。任何其他域名   需要至少三个。七   特殊的顶级域名是:“COM”,   “EDU”,“NET”,“ORG”,“GOV”,“MIL”和   “INT”。

所以,你要么:

  • 为您的网站使用“www.domain.com
  • 或为您的静态内容使用完全不同的域名(例如“.anotherdomain.com”)
    • 例如,这是在stackoverflow上完成的:静态内容从sstatic.net提供

答案 1 :(得分:6)

这就是为什么很多站点(包括这个站点)注册一个专用域用作CDN的原因。

答案 2 :(得分:1)

由于Cookie域名是tail matched,因此无法对域名进行操作。你必须使用www。

答案 3 :(得分:0)

当然可以!那就是大多数网站所做的。甚至内置的php函数session_start()都可以做到这一点。其Set-Cookie http响应标头看起来就像这样简单:

Set-Cookie: PHPSESSID=fe26eaac143ef75ffcbc91bbe5780d0d; path=/

根据RFC 6265, section 4.1.2.3,该段中的最后一个语句:

  

如果服务器省略“域”属性,则用户      代理会将Cookie仅 返回到原始服务器。

因此,您要做的就是在设置domain.com中的cookie时忽略domain属性。

setcookie($name,$value,$expires,'/','');

为进一步确认,我自己进行了测试,并向您保证,当您在省略域属性的同时设置'em时,无法从子域访问cookie。