当 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 中的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章