IE 跨域cookie无效的解决

各种 Web 服务器认证 Ajax 的跨域(转)

晕掉,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
<?php
header('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

posted on 2013-06-27 17:18  莫莫  阅读(913)  评论(0)    收藏  举报

导航