$http.post 跨域请求在 Internet Explorer 中不起作用(网络错误 0x80070005,访问被拒绝)

Posted

技术标签:

【中文标题】$http.post 跨域请求在 Internet Explorer 中不起作用(网络错误 0x80070005,访问被拒绝)【英文标题】:$http.post cross domain request not working in Internet explorer (Network Error 0x80070005, Access is denied) 【发布时间】:2017-06-08 08:55:46 【问题描述】:

当我发出 $http.post 请求并将“withCredentials”属性设置为 true 时。 我的请求在 Chrome 和 Fiefox 中运行良好。但是,我在 IE 中收到以下错误:

XMLHttpRequest:网络错误 0x80070005,访问被拒绝。

我注意到,如果我在 IE 中启用“跨域访问数据资源”设置,错误就会得到解决。但是我需要找到一个替代解决方案,因为我不能要求用户明显启用该设置。

我注意到对同一域的 $http.get 请求在 IE 中没有问题,问题仅在于 $http.post 请求,选项请求正在获取 500 内部服务器,我看到请求和响应标头下面:

笔记: 我确实有必要的自定义标头,当 OPTIONS 请求成功时,我可以在 Chrome 中看到它们。下面列出了我在 Chrome 中看到的标题:

如果我遗漏了一些可以使请求在 IE 中工作而无需启用跨域访问数据源的内容,请告诉我吗?

【问题讨论】:

您在哪个版本的 IE 上测试? 它是 IE 11 ,但我尝试在调试器的模拟器选项卡中切换到 IE 10,9,8,7 并得到同样的错误 显然您的服务器没有正确响应 OPTIONS 请求。修复服务器。 您是否已经诊断出服务器响应 500 响应的原因?这是一条非常重要的信息。 但是服务器对 Chrome 中的相同请求响应为 200,并且在启用“跨域访问数据源”的情况下对 IE 中的相同请求响应为 200,所以看起来很好跨度> 【参考方案1】:

Internet Explorer 9 不支持 CORS 请求中的 cookie。 $http 参数的 withCredentials 属性尝试发送 cookie。我认为没有任何方法可以用标题修复它。 IE10+ 应该默认工作,只要确保你没有处于兼容模式。 CORS 也没有在 IE10 中完全实现,但是您尝试执行的请求类型应该可以工作。

您没有提到您的网络应用程序的性质是什么,但它会影响您在 IE9 中需要的解决方法类型。如果可能的话,看看你是否可以重构你的代码以使用 GET 请求(同样,我不知道你想通过 AJAX 做什么,所以这可能是不可能的)。

您可以使用Modernizr 或类似的东西来检测浏览器是否支持CORS。如果不支持,请发送不带 AJAX 的请求并刷新页面。

如果您真的想使用 AJAX,另一种选择是在您的 Web 服务器上设置代理,即同一域上的服务器。您不是直接发出跨域请求,而是向同源服务器发出 AJAX 请求,然后由同源服务器向您发出跨域服务器的请求。服务器不会有 CORS 问题。当然,此解决方案假定您正在执行一些服务器端脚本,例如 php、Node 或 Java。

【讨论】:

OP 询问的请求类型不适用于默认的 IE9 设置。不确定我所说的在这种情况下有什么不准确的地方。 具体来说就是cookie的使用(Angular中的withCredentials)。见:***.com/questions/10941281/… 感谢您的回答,但我的问题不仅仅是 IE 9。您提到它应该在默认情况下与 IE 10+ 一起使用,但事实并非如此。在 IE Emulation 中,我确实看到它通过 X-UA 兼容元标记显示文档模式(默认 10)。不确定这是否与问题有关。 我也很困惑为什么启用跨域访问数据源设置可以解决问题

以上是关于$http.post 跨域请求在 Internet Explorer 中不起作用(网络错误 0x80070005,访问被拒绝)的主要内容,如果未能解决你的问题,请参考以下文章

Internet Explorer 中允许的 Ajax 跨域请求

Internet Explorer 中的跨域 POST 请求 ajax

Internet Explorer 中的跨域 POST 请求 ajax

AngularJS实现跨域请求

Internet Explorer 为授权设置跨域 cookie

跨域设置(服务器Nginx和Apache)