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

Posted

技术标签:

【中文标题】当 ajax 目标是 localhost 时,IE 10 和 11 中的访问被拒绝【英文标题】:Access denied in IE 10 and 11 when ajax target is localhost 【发布时间】:2014-04-01 15:18:49 【问题描述】:

我正在尝试在 Internet 上的服务器 (http) 之间进行 ajax 调用。并将其定位到我自己的本地主机。 FF/Chrome/ETC... 有效。这只是一个IE问题。我正在使用 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) 

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

【问题讨论】:

【参考方案1】:

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 的此测试页面并将您的本地主机站点作为远程 URL 来测试这一点。

【讨论】:

但是如果你的 JS 正在被其他人运行并且你无法更改他们的 IE 安全设​​置怎么办?这解决了一台计算机的问题....但不是部署的代码。 @theUtherSide 如果您的代码被部署到本地主机,那么您已经在用户的工作站上部署/安装了一些东西。如果您有权访问他们的工作站,则可以更改他们的 IE 安全设​​置。如果您的用户手动部署/安装,您可以在安装说明中包含 IE 安全设​​置更改。 @oobug 这正是我的观点——这个答案仅适用于您有权更改 IE 安全设​​置的情况。如果你有一些内部应用,那很好,但它不适用于狂野网络上的 JS 代码。 @theUtherSide 提出的问题专门针对针对本地主机的 Ajax 调用。我建议不要开发一个对 localhost 进行 Ajax 调用的 Web 应用程序,除非您还开发了一些部署到 localhost 的东西。【参考方案2】:

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

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

【讨论】:

这解决了我的问题。 4 年后,IE 不喜欢 http vs https 但其他浏览器似乎并不在意。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

OP特别说是IE10/11。 XDomainRequest 仅适用于 IE9 及以下版本。 用户更新了他的问题 - 之前他没有指出 IE 版本,所以我认为它是 9。 第一个链接失效了。【参考方案5】:

注意:

不要在 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;
;

【讨论】:

以上是关于当 ajax 目标是 localhost 时,IE 10 和 11 中的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 IE 上使用 ajax 调用时遇到 403 错误

ajax在IE中无法正常测试原因的探索及学习

//……关于同源策略

ajax缓存问题

IE9 ajax保存权限被拒绝

IE浏览器下AJAX缓存问题导致数据不更新的解决办法