当ajax目标是localhost时,IE 10和11中的访问被拒绝

时间:2014-02-28 14:45:06

标签: ajax xmlhttprequest cors internet-explorer-10 internet-explorer-11

我正在尝试在互联网上的服务器(http)之间进行ajax调用。并将其定位到我自己的localhost。 FF / Chrome / ETC ......有效。它只是一个IE问题。 IM使用IE 11和10。

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

这是代码。只是为了你看。

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) {}

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

5 个答案:

答案 0 :(得分:42)

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

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

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost/', true); // This line will trigger an error
xhr.send();

您可以通过将原始站点添加到“受信任的站点”安全区域来解决此错误。您可以通过将“http://client.cors-api.appspot.com”添加到“受信任的站点”区域并使用test-cors.org上的此测试页与您的localhost站点作为远程URL来进行测试。

答案 1 :(得分:17)

除了受信任的网站要求之外,我发现问题并没有解决,直到我使用与我的来源相同的协议,例如我的测试站点托管在https上,但是使用http(没有s)的任何目标都失败了。

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

答案 2 :(得分:3)

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

另一个选择是使用这样的库:https://github.com/jpillora/xdomain

答案 3 :(得分:2)

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

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

https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

答案 4 :(得分:-7)

注意:

不要在Ajax中使用“http://www.domain.xxx”或“http://localhost/”或“IP”作为URL。 仅使用不带地址的路径(目录)和页面名称。

错误状态:

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;
};
相关问题