在前面的文章中“谷歌浏览器Chrome 80版本默认SameSite导致跨域请求Cookie丢失”,我们知道 Chrome 升级到80版本后,默认限制了跨域携带cookie给后端。在解决这个问题的同时,发现有用户在使用 IE 浏览器时,通过IFrame嵌套页面时,也出现了Cookie丢失的问题。
经过查找,发现原来是 IE 有个叫P3P(The Platform for Privacy Preferences)隐私参数选择平台这样一个功能。如果 frame 是来自第三方站点(不同IP或不同域名),那么默认情况下 IE 会自动禁用这些站点的cookie,也就是在请求某url时在HTTP header里不发送它们的 cookie,包括 session 的 cookie。注意,这些站点在 response里面设置的cookie还是会被发送到浏览器的。
但像IE 6.0和IE 7.0有个自己的标准,要支持P3P,IE 6的缺省隐私等级设置为"中"——即"阻止没有合同隐私策略的第三方cookie"。而在用户通过frame嵌套浏览第三方网页时,就造成了跨域,第三方网站的Cookie就会丢失。
PHP程序处理方式:
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"')
apache的服务器:
<VirtualHost> Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"' </VirtualHost>