[英]Ajax error - “permission denied”
对不起,这看起来比它可能更长,但我想我应该包括所有信息!
我正在使用一个简单的Ajax脚本来动态地将内容带入页面上的<div>。 将一些新内容加载到div中的第一个请求工作正常,但如果我刚刚加载的内容中有一个Ajax“后退”链接,则似乎会抛出错误。
更奇怪的是,它可以在我的办公室网络上运行,但它失败如果我在家里或VPN网络上。 如果失败,则会在JavaScript调试器中弹出此错误:
Line: 12
Char: 11
Error: Permission Denied
Code: 0
URL: http://www.example.com/about.php
代码真的不是那么复杂,它只是在W3网站上的一个有点被黑客攻击的版本,但返回调用被“拒绝”的事实令我感到困惑。 是否可以在服务器IIS配置中停止脚本攻击? (随机思考?)
任何帮助赞赏;)
首先 - Ajax脚本
var myHttpRequest = false;
if(window.XMLHttpRequest)
myHttpRequest = new XMLHttpRequest();
else if(window.ActiveXObject)
myHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
function loadContent(source, content)
{
if(myHttpRequest)
{
var data = document.getElementById(content);
myHttpRequest.open("GET",source);
data.innerHTML = '<div class=\"loading_image\"><img src=\"images/loading.gif\" width=\"54px\" height=\"55px\" alt="loading" /></div>';
myHttpRequest.onreadystatechange = function()
{
if(myHttpRequest.readyState==4)
data.innerHTML = myHttpRequest.responseText;
$('#col2_2_content').supersleight();
}
myHttpRequest.send(null);
}
}
然后,这是一个截断的示例,该页面调用Ajax内容并具有col2_2_content Div,其中插入了所有内容。 头部分引用了文件ajax.js
<div id="col2_2_content">
<div class="mugshot_container">
<img src="images/mugshot_dh.jpg" onClick="loadContent('about/dh.php?ajax=yes', 'col2_2_content');"/>
</div>
</div>
这是来自about/dh.php
的代码,它通过Ajax插入,以及PHP格式来决定应该返回什么。 (它的设计也是直接调用的 - 在这种情况下它会得到一个页眉/页脚)。
<?php
$home_url = "http://www.example.com/url/";
$content = "
<p>Some Text</p>
<p><a onClick=\"loadContent('$home_url/about/about-main.php?ajax=yes', 'col2_2_content');\">Back</a></p>
";
if (isset($_REQUEST['ajax']) ) {
echo $content;
} else {
include_once 'about-header.php';
echo $content;
include_once 'about-footer.php';
}
?>
“许可被拒绝”听起来很可疑,好像你有同样的原始政策问题。
你有自己的跨域请求情况。 AJAX请求基本上只能用于服务页面的服务器。 因此,如果您的脚本页面是从http://website.com/url
加载的,您可以拨打http://website.com/
但任何对http://url.com
调用都将失败。
话虽如此,如果您运行document.domain = "example.com"
,可以从http://s2.example.com
调用http://s1.example.com
。
但是,如果您确实需要跨域访问数据,那么几乎没有办法。 我知道的最简单的方法是使用<script>
标签来进行查询。 您可以编辑您的文档,将<script>
标记添加到您喜欢的任何src
,浏览器将转到那里并为您获取脚本。 因此,如果你控制http://url.com
,你可以让它创建一个javascript而不是HTML页面,这个脚本将被加载和执行。 此方法用于使JSONP工作。
跨站点脚本可能在本地网络中没有安全问题的情况下工作,因为IE在这种情况下没有那么多限制。 我怀疑它甚至可以在你的局域网中的任何其他浏览器中工作。
$home_url
是否与发出XMLHTTP请求的页面位于同一个域中?
权限被拒绝错误几乎总是因为尝试跨域或安全区域请求内容...( http://msdn.microsoft.com/en-us/library/ms537505%28VS.85%29.aspx#xdomain特别是因为你通过VPN而不是办公室看到它,这听起来可能是问题所在。
我会启动Firebug或其他一些调试工具,让您查看请求是什么。
鉴于已发布的所有答案。 我建议你使用相对的URL。 我相信XMLHttpRequest可以在最新的浏览器中跨域。 W3C不久前发布了这个规格。
我相信就是这样: http : //www.w3.org/TR/access-control/
如果要跨域,也可以使用动态脚本标记。 这似乎是最受欢迎的。 通常,这是通过javascript页面编写回调来实现的,以JSON作为参数。
在浏览器中还有许多其他方法可以启用跨域http,但它们都涉及事先设置,除非您使用代理。 您实际上可以使用通过Javascript响应的代理,因此代理也可以位于远程域上。
我在这里有一个例子:
这是另一个专门设置为使用XML资源并使用JSON进行响应的设置。
if ($_SERVER['HTTP_HOST'] == "mysite.com") {
$home_url = "http://mysite.com/testing/rebrand/";
} else {
$home_url = "http://www.mysite.com/testing/rebrand/";
}
无法在评论中发布此内容,因此请将其放在此处;)
这样做了 - 我在config.php中添加了这个以区分域。 一切现在都可以正常运行。 多谢你们 :)
注 - 注意
对于ajax中的URL,请勿使用“ http://www.domain.xxx ”或“ http:// localhost / ”或“IP >> 127.0.0.1”。 仅使用没有地址的路径(目录)和页面名称。
虚假状态:
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir1/dir2/page.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','dir1/dir2/page.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;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.