在任何低于10的IE版本中,XMLHttpRequest访问被AngularJS拒绝
在任何10以前版本的Microsoft IE浏览器上查看我的应用程序时,在控制台中出现以下奇怪的错误:
我已经尝试在AngularJS库之前添加以下JavaScript代码来取消控制台:
console.log = function(){}; window.console = {log: function(){}};
这没有什么区别。 在IE 10中出现同样的错误:
SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.
可能我试图从API获取“/我”,以检查用户是否通过身份validation或访客。
基本上。 消除那些恼人的控制台错误,每次服务器给出的响应以外的2XX或3XX将是伟大的!
更新:这似乎与通过不同的子域(CORS)访问API有关;
我通过在Google AngularJS团队中经验丰富的ng-dev的指导,已经能够实现的解决scheme就是这个xDomain库 。
设置非常简单,只需在你的API的根目录下放置一个proxy.html文件,一个允许的来源('master')的正则expression式/string和前端脚本的引用,然后指向这个文件从您的前端脚本('主')。
它通过在iframe中打开proxy.html文件并使用postMessage
与CORS资源进行通信来工作。
像$ http和$资源一样具有魅力。
您还可以通过将脚本放在所有JavaScript库之上来保持正常浏览器的正常运行:
<!--[if lte IE 9]> <script src="xdomain.js" slave="http://example.org/proxy.html"></script> <![endif]-->
当然你的问题是CORS相关的。 IE10使用真正的XmlHttpRequest,但在此之前,IE没有。 到目前为止,我发现解决这些types问题的最简单方法是使用apache或nginx来代理API。 例如,用nginx,在你的服务器{}
块中:
location /api { proxy_pass http://my.server.name:12345/v1; proxy_redirect off; }
请注意,即使jQuery完全不支持XDomainRequest和CORS,您也必须添加一个插件来获取XDR。 另外请注意,XDR对CORS有一些严格的限制。
在我的情况下, Response Headers
包含
Content-Type:application/json; charset=UTF-8
这是IE9的一个问题,因为它不能正确处理/parsingJSON对象的响应。
将Response Headers
转换为
Content-Type:text/plain; charset=UTF-8
另外,请确保为IE9提供以下模块: https : //stackoverflow.com/a/28905072/1202371
允许接收文本中的响应,然后将其转换为JSON对象。