IE在常规ajax请求上抛出错误

时间:2013-08-14 08:28:34

标签: ajax facebook cors same-origin-policy

我在构建的Facebook页面标签中遇到了问题。

该网站在Chrome和Firefox中运行良好,但我在IE中尝试做一些简单的操作时遇到了问题。

[基础网址:http://domain.com/]
[REQ网址:http://domain.com/request]

我想要做的是在REQ网址上从我的服务器BASE URL再次向我的服务器发出一个简单的ajax请求,在Chrome或Firefox中我得到了预期的结果,但是我收到了一些错误和警告。< / p>

警告如下(没有敏感域信息)

SEC7118: XMLHttpRequest for https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=URL_ENCODED_REDIRECT_URI required Cross Origin Resource Sharing (CORS).

SEC7119: XMLHttpRequest for https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=URL_ENCODED_REDIRECT_URI required CORS preflight. 

错误如下

SEC7120: Origin http://domain.com not found in Access-Control-Allow-Origin header.

SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.

我已经对这些错误进行了大量研究,我知道它们与Cross Origin Control有关,并且从一个域中发出请求与另一个域不匹配。奇怪的是,虽然我的两个域都是相同的,所以CORS不应该适用。我无法弄清楚我错过了什么。我已经阅读了至少20篇关于堆栈溢出的文章,但没有一篇能够完全解决我的问题。

REQ_URL中的/ request /是一个从控制器调用的方法,我只需要调用这个方法,没有什么特别的,它是一个简单的PHP函数。

function request() {
    return 'you win!';
}

ajax正在使用jQuery特定地生成请求$ .get方法这是我的代码:

$.get('/request', function(response){
    console.log(response);
});

我没有回复。

我还尝试使用$ .ajax并调用完整方法,我得到一个文本状态类型返回&#39;错误&#39;我希望这是上述错误的结果。

我已阅读并理解以下文章:

Cross-origin resource sharing Same-origin policy

根据同源策略,我不应该被绑定到CORS,我的获取请求应该正常工作,或者我错过了什么。

感谢任何帮助。

[&#39; UPDATE&#39;]

我已经发现上述错误只发生在Facebook(Facebook页面标签)内部,而且#34;我认为&#34;是iframe来自域名&#34; http://static.ak.facebook.com/&#34;和我的域名&#34; http://domain.com&#34;这打破了同源策略规则。非常烦人,因为当进行ajax调用时,它们是从&#34; http://static.ak.facebook.com/&#34;到&#34; http://domain.com&#34;在那里,我得到了跨域政策错误。

我仍然不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

投票数不多,观点不多。

我找到了问题和解决方案。

对于我的特定情况,我使用会话来处理服务器端的信息,发生的事情是会话没有持久存在于IE中,导致我的其他一些代码将ajax请求重定向到另一个域(facebook.com) )导致您在上面看到的跨域请求错误。

解决方案:

我发现IE不喜欢通过ajax传递会话但是你可以告诉它,跟随其他现代浏览器这样做是个好主意,这就像添加P3P标题一样简单。 / p>

在发送请求之前将其添加到您的代码中,并且应在请求中发送会话变量。

  header('P3P:  CP="IDC  DSP  COR  ADM  DEVi  TAIi  PSA  PSD  IVAi  IVDi  CONi  HIS  OUR  IND  CNT"');

我最终重写了我的应用程序而没有那么多的会议依赖,但这绝对是关于IE的一个很好的学习点,以及它如何通过ajax处理会话。