4

我构建的 Facebook 页面选项卡存在问题。

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

[基本 URL:http://domain.com/]
[请求 URL:http://domain.com/request]

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

警告如下(不含敏感域信息)

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.

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

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

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

ajax 使用 jQuery 来发出请求,特别是 $.get 方法,这是我的代码:

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

我没有得到回应。

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

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

跨域资源共享 同源策略

根据同源政策,我不应该绑定到 CORS,我的 get 请求应该可以正常工作,或者我错过了什么。

任何帮助表示赞赏。

['更新']

我已经确定上述错误仅在 facebook(Facebook 页面选项卡)内部时发生,这个“我认为”是 iframe 来自域“ http://static.ak.facebook.com/ ”和我的域“的结果http://domain.com " 这违反了同源策略规则。非常烦人,因为当进行 ajax 调用时,它们会从“ http://static.ak.facebook.com/ ”发送到“ http://domain.com ”,因为我遇到了跨域策略错误。

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

4

1 回答 1

1

没有多少赞成票,没有多少意见。

我发现了问题和解决方案。

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

解决方案:

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

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

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

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

于 2013-08-26T01:29:47.143 回答