IE10似乎处理cookie和子域不同于其他主流浏览器(IE8,IE9,火狐,Chrome,Safari浏览器)。
我们使用子域名广泛的测试环境,例如:
- user1.devel.example.com
- user2.devel.example.com
- qa.example.com
而我们的生产环境那上面住着,例如:example.com(和在技术上www.example.com以及)。
我们使用PHP setcookie($name, $value, $expires)
通过分配一个空字符串值函数天真地(没有明确的路径或域指定)设置cookie,然后清除Cookies(当用户注销)。 这一直工作得很好,而且每个唯一子用自己的饼干。
IE10现在的“股票”这是在所有子域名的顶级域名设置cookie。 我们观察到的初始症状是,没有人能注销子域。 我们已经观察到的几件事情:
- 尽管这股值,无子域是能够清除该cookie。
- 当TLD清除cookie时,它立即从所有子域移除。
有没有其他人看到类似的行为IE10店/如何应用于相对于子域的cookies? 有任何解决方法,不是被明确有关的cookie适用发送初始设置Cookie标头时,该域名的其他?
我刚才碰到这个问题。
这里是某人的链接探索这个bug /问题: 有和没有指定域(浏览器不一致)饼干
这也可能是相关的: Cookie的设置子域,但IE开发工具显示在根域的cookie。 我在想什么?
我的结论是,从非www根域(设置cookie时http://sites.com ),在IE中这被看作是一个通配符的cookie的所有子域。 Chrome和Firefox不显示这种行为 - 他们一个cookie从非www根域设置为仅正在与根段有关关联。
我编写了使用.NET的WebForms,IIS和我的主机文件示例站点。 我有3点:a.site.com,b.site.com和site.com。 他们都担任饼干完全相同的名称。 让我们把它称为“购物车”。
您可以在饼干设置多个属性,包括饼干应该与相关的域名。 我留下来定义/左由.NET未定义此属性。 当Chrome浏览器从每个站点接收cookie的,它显示的cookie的域在浏览器地址栏中列出的域是明确的。 在IE浏览器,这是情况并非如此。 即,从把该cookie http://sites.com为被定义为“.sites.com”,并根据RFC饼干,这意味着它是从所有子域访问。
另外,在IE浏览器,如果多个cookie设置具有相同的名称,IE他们返回到他们的顺序分别设置服务器。 所以,如果我访问http://sites.com第一,然后访问http://a.sites.com然后刷新,IE从观看的cookie http://sites.com作为一个有效的cookie发送到服务器它的请求http://a.sites.com它与cookie中一起发送http://a.sites.com ,除了饼干的http://sites.com是在列表中的第一个。
在.NET中,从我所看到的,饼干一般由键名,而不是访问的索引。 因此,当服务器端代码试图访问一个名为“购物车”的键的值,它会抢设置cookie值的第一个网站的价值-在这里,这将是http://sites.com 。
综上所述 - 当你有子站点都共享同一个cookie的键名,因为虽然铬/火狐处理域协会如你所愿,IE会导致错误行为不使用非www域名。
编辑 -
只是为了澄清任何人读这篇文章,我使用IE10来探讨这个问题。
超级如果你有一个域的多个PHP网站简单的方法来解决这个问题。
例如 - 如果你有WordPress的根(example.com),你必须在子域(a.example.com),那么无论你的应用程序或WordPress的范围内,你需要设置不同的SESSIONNAME一个自定义的PHP应用程序。
在会话名称()你在session_start()这应该给两个不同的名字会话,因此并不冲突之前加入。
session_name('AppSession');
session_start();
简单。
是的,这是一个已知的问题似乎在这里读到: http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx
他们指的这个测试: http://debugtheweb.com/test/cookieinherit.aspx和http://www.debugtheweb.com/test/cookieinherit.aspx
我有同样的问题在IE 11.0.9600为PHP会话cookie:Internet Explorer正在发送根域饼干及其所有子域。 为了解决这个问题,我存储在会话变量域名:
$_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']);
然后为每一个请求,我检查会话变量:
if ( str_replace('www.', '', $_SERVER['HTTP_HOST']) != $_SESSION['URL']) {
session_regenerate_id(true);
$_SESSION = array();
$_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']);
}
然后,当我们从根域的子域移动,我们不会“在”同一个会话。