在IE10和11中,当ajax目标为localhost时拒绝访问

在IE10和11中,当ajax目标为localhost时拒绝访问,ajax,xmlhttprequest,cors,internet-explorer-10,internet-explorer-11,Ajax,Xmlhttprequest,Cors,Internet Explorer 10,Internet Explorer 11,我正在尝试在internet上的服务器(http)之间进行ajax调用。并将其指向我自己的本地主机。FF/铬/等。。。作品这只是一个IE问题。我正在使用IE11和IE10 请求甚至没有完成。“拒绝访问”会立即抛出 这是代码。只是让你看看 不是IE8和IE9中典型的HTTP/HTTPS错误。这是另外一回事,但文档没有帮助 $jq.ajax({ contentType: 'application/json', url: url,

我正在尝试在internet上的服务器(http)之间进行ajax调用。并将其指向我自己的本地主机。FF/铬/等。。。作品这只是一个IE问题。我正在使用IE11和IE10

请求甚至没有完成。“拒绝访问”会立即抛出

这是代码。只是让你看看

不是IE8和IE9中典型的HTTP/HTTPS错误。这是另外一回事,但文档没有帮助

$jq.ajax({
            contentType: 'application/json',
            url: url,
            dataType: 'json',
            crossDomain: true,
            beforeSend: function (xhr) {
                xhr.withCredentials = true; 
                xhr.setRequestHeader("Authorization", "Basic " + $jq.base64.encode(username and password));
            },
            success: function (data, status, headers) {},
            error: function (xhr, status, error) {}

xhr
对象中的状态为
0
,错误为“拒绝访问”

如果您试图在IE9中发出跨源ajax请求,则需要使用
XDomainRequest
而不是
XMLHttpRequest
。有一个jQuery插件包装了XDR。您应该知道XDR有一些明显的局限性


另一种选择是使用如下库:。

jQuery使用IE9不支持的
XMLHttpRequest
对象实现ajax调用。您必须强制它使用
XDomainRequest

我使用jQuery插件解决了这个问题:


Internet Explorer将此错误作为其安全区功能的一部分。使用默认安全设置,尝试从“Internet”区域中的源访问“本地intranet”区域中的资源时,会引发“访问被拒绝”错误

如果您手动编写Ajax代码,Internet Explorer将在您尝试打开资源时引发错误。例如:

var xhr=new-XMLHttpRequest();
xhr.open('GET','http://localhost/“,对);//这一行将触发一个错误
xhr.send();

您可以通过将源站点添加到“受信任站点”安全区域来解决此错误。您可以通过添加“”来测试这一点http://client.cors-api.appspot.com“到您的“受信任的站点”区域,并使用此测试页面,以您的本地主机站点作为远程URL。

除了受信任的站点要求之外,我发现问题没有得到解决,直到我使用与我的源站相同的协议来处理请求为止,例如,我的测试站点托管在https上,但在任何使用http的目的地(没有s)时失败

这只适用于IE,Chrome只是礼貌地在调试控制台中记录警告,不会失败。

注意:

在Ajax中,不要对URL使用“”或“”或“IP”。 只使用路径(目录)和页面名称,不使用地址

错误状态:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true);   // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);



function createAjax()
{
    var ajaxHttp = null;
    try
    {
        if(typeof ActiveXObject == 'function')
            ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP");
        else 
        if(window.XMLHttpRequest)
            ajaxHttp = new XMLHttpRequest();
    }
    catch(e)
    {
        alert(e.message);
        return null;
    }
    //-------------
    return ajaxHttp;
};
真实状态:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true);   // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);



function createAjax()
{
    var ajaxHttp = null;
    try
    {
        if(typeof ActiveXObject == 'function')
            ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP");
        else 
        if(window.XMLHttpRequest)
            ajaxHttp = new XMLHttpRequest();
    }
    catch(e)
    {
        alert(e.message);
        return null;
    }
    //-------------
    return ajaxHttp;
};
var AJAXobj=createAjax();
AJAXobj.onreadystatechange=handlesAJAXcheck;

open('POST','dir/getSecurityCode.php',true);//OP明确表示这是IE10/11。XDomainRequest仅适用于IE9及以下版本。用户已更新了他的问题-之前他没有指明IE版本,所以我假设它是9。第一个链接已失效。但如果您的JS由其他人运行,而您无法更改他们的IE安全设置,该怎么办?这解决了一台计算机的问题……但对已部署的代码却没有。@theUtherSide如果您的代码被部署到本地主机,那么您就已经在用户的工作站上部署/安装了一些东西。如果您有权访问他们的工作站,您可以更改他们的IE安全设置。如果您的用户正在手动部署/安装,您可以在安装说明中包括IE安全设置更改。@oobug这正是我的观点——只有在您有权更改IE安全设置的情况下,这个答案才适用。如果您有一些内部应用程序,这很好,但它不适用于wild web上的JS代码。@作者回答的问题是专门针对本地主机的Ajax调用。我建议不要开发对localhost进行Ajax调用的web应用程序,除非您还开发了部署到localhost的东西。这解决了我的问题。4年后,IE不喜欢http vs https,但其他浏览器似乎并不在意。