IE9 JQuery.Ajax抛出神秘错误



我在IE9中遇到了一个困难的ajax错误。我想说的是,从技术上讲,这不是一个跨域请求,所以我相信这不是问题。

编辑:似乎问题可能与同一域请求被视为跨域有关,尽管不清楚为什么(见注释)。

我使用本地代理进行跨域ajax请求,我使用的url看起来像http://localhost/proxy/?target=.....所有好的浏览器都对此感到高兴,但IE立即返回一个错误,甚至在请求被调度之前(我已经使用Fiddler和IE的开发人员工具网络捕获验证了这一点)。

当我检查错误对象传递给JQuery的ajax。错误回调它的isRejected()函数返回true,但我找不到什么会导致请求被拒绝。错误对象的readyState为4(表示请求已经完成?),status为0,statusText为"error"。

我的请求是这样构建的:

$.ajax(url, {
    data: {...list of parameters...},
    dataType: 'json',
    type: 'GET',
    success: function() { ... },
    error: function() { ... },
    beforeSend: proxy.beforeRequestSend,
    timeout: 35000
});

代理。beforeerequestsend函数如下:

this.beforeRequestSend = function(XHR, settings) {
  if(that.proxyRequired(settings.url)) {
    // I've also tried using the full url (http://localhost/proxy/?...)
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url); 
  }
};

有人知道什么会导致请求在IE9中完全失败吗?不幸的是,我无法访问IE8或ie7进行测试,但我认为它们的行为是一样的。调用JQuery的ajax错误处理程序的事实表明,错误不是在构建请求时发生的,而是在应该执行请求时发生的。所有其他浏览器工作正常告诉我基本原理是正确的。

我以前读过JQuery/IE组合有URL编码一些字符的问题,但如果我在beforeend函数结束时警告settings.url,目标URL被正确编码(这也告诉我that.proxyRequired(settings.url)返回true)。

在你的javascript中,在你调用$。Ajax(或同等)强制跨域行为:

JQuery.support.cors=true;

您的代理操作是否发送重定向以响应ajax调用?浏览器静默地遵循重定向,这可能是XHR检测XSS尝试的原因。因为jQuery在IE9上不支持CORS,所以你会看到这个错误。

查看其他Stackoverflow问题:跨源Ajax请求不能在Opera和IE9中工作?

正如您在我的问题的代码中看到的,我在JQuery中添加了代理url。ajax函数的beforeend回调(proxy.beforeRequestSend)。当这个函数被执行时,JQuery已经检查了请求并确定它是跨域的。

结果,JQuery将我的所有请求视为跨域请求,即使它们都去了本地代理。JQuery随后拒绝了IE和Opera中的任何跨域请求,因为它们不支持CORS。

幸运的是,crossDomain属性在settings对象中传递给beforeend回调,并且很容易更改。

this.beforeRequestSend = function(XHR, settings) {
  if(that.proxyRequired(settings.url)) {
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url);
    settings.crossDomain = false;
  }
};

相关内容

  • 没有找到相关文章

最新更新