IE11中同域不同子域iframe内嵌站点击_blank链接丢失Cookie问题
我之前碰到过完全一样的IE11专属问题,折腾了好一阵才搞清楚根源,下面给你梳理清楚场景、原因和解决方案:
问题场景确认
先把你的场景再明确下,避免理解偏差:
- 两个HTTPS子域站点:
subdomain-a.example.com和subdomain-b.example.com subdomain-a用iframe嵌入了subdomain-b的页面,代码是:<iframe src="https://subdomain-b.example.com/index.php"></iframe>subdomain-b的首页设置了Cookie,还放了个target="_blank"的链接:<?php setcookie("TestCookie", "someValue"); ?> <a href="showcookie.php" target="_blank">link</a>- 点击链接打开的
showcookie.php负责打印Cookie:<?php print_r($_COOKIE); ?>
核心问题:只有IE11里点击这个_blank链接后,新标签页的Cookie是空的,其他主流浏览器(Chrome、Firefox、Edge)都正常。
为什么只有IE11会出问题?
IE11在处理跨子域iframe的_blank跳转时,有个很特殊的同源策略逻辑:
当你从iframe里用_blank打开新窗口时,IE11会把新窗口的"上下文来源"绑定到父页面(也就是subdomain-a.example.com),而不是iframe所在的subdomain-b.example.com。这就导致新窗口去读取subdomain-b的Cookie时,被IE11的安全策略拦截了——毕竟两个子域默认是不共享Cookie的,再加上HTTPS的安全限制,直接就丢了。
解决方案(亲测有效)
1. 给Cookie设置统一的根域属性
这是最关键的一步:在subdomain-b设置Cookie时,明确指定Domain为根域.example.com,这样所有子域都能访问这个Cookie。修改index.php的Cookie代码:
<?php // 注意Domain前面的点,IE11必须这么写 setcookie("TestCookie", "someValue", [ 'expires' => time() + 3600, // 1小时有效期,可按需调整 'path' => '/', 'domain' => '.example.com', 'secure' => true, // HTTPS环境必须加,否则IE11可能不存Cookie 'httponly' => true, // 提升安全性,避免XSS窃取Cookie 'samesite' => 'Lax' // 兼容IE11,同时防止CSRF ]); ?>
2. 给链接添加rel="noopener noreferrer"(可选但推荐)
这个属性可以强制IE11不要把新窗口的上下文绑定到父页面,同时还能提升安全性,防止潜在的窗口劫持问题:
<a href="showcookie.php" target="_blank" rel="noopener noreferrer">link</a>
3. 清理IE11缓存后测试
IE11的Cookie缓存有时候会有残留,测试前记得:
- 打开IE11的Internet选项,清除浏览历史里的Cookie和网站数据
- 重新访问
subdomain-a.example.com,点击链接测试
按上面的步骤改完后,IE11里新标签页应该就能正常读取到TestCookie了。
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

