我在构建的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;在那里,我得到了跨域政策错误。
我仍然不知道如何解决这个问题。
答案 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处理会话。