IE 跨域cookie无效的解决
晕掉,IE真是超级破,还好我二年没用它了(用了二年linux做桌面).这次一个大问题,客户的一台主页使用了frame的方法来固定自己的域名指向一个二级,为了让用户看起来更加好.
但发现很多用户不能登陆,但有的用户也能登陆(现在才清楚能上的都是firefox).查了好久,后来发现原来是IE有个叫P3P(The Platform for Privacy Preferences)隐私参数选择平台,这样的一个超强的功能.
在 frameset 里面,也就是里面的 frame 是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie,也就是在请求某url时在HTTP header里不发送它们的 cookie,包括 session 的 cookie.注意,这些站点在 response里面设置的cookie还是会被发送到浏览器的.
但象IE 6.0和IE 7.0有个自己的标准.要支持P3P,IE 6的缺省隐私等级设置为"中"——即"阻止没有合同隐私策略的第三方cookie".而在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe指向b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外.
所以,每次当用户进行 Ajax 提交时,就挂掉了.因为传不到真实的服务器.
好了,不多讲了,直接讲解决方案.
PHP的程序
可以直接在B网站中写入
|
1
2
3
|
<?phpheader('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"')?> |
这样就能接受第三方的Cookie啦.
lighttpd的服务器
|
1
2
|
server.modules = ("mod_setenv")setenv.add-response-header = ( "P3P" => "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'") |
apache的服务器
|
1
2
3
|
<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> |
Nginx 的服务器
在 Nginx 中关不支持 options ,所以我们要做一个假的,设置响应头:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; return 200;}if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';}if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';} |
#允许跨域的域,*代表所有域都接收
Access-Control-Allow-Origin: http://foo.example
#允许跨域执行的方法
Access-Control-Allow-Methods: POST, GET, OPTIONS
#允许跨域设置的头信息
Access-Control-Allow-Headers: X-PINGOTHER 所面之所以对 GET 和 POST 都加一个,是因为如果不加,能访问,但会显示红色.
IIS的服务器 增加一个网站http头来解决问题; 管理工具——〉选择一个网站——〉属性——〉http头,增加一个http头 然后输入头名:P3P 输入头内容:CP=CAO PSA OUR
浙公网安备 33010602011771号