对不起,这看起来比它可能更长,但我想我应该包含所有信息!
我正在使用一个简单的Ajax脚本动态地将内容带入< div>在页面上。将一些新内容加载到div中的第一个请求工作正常,但如果我刚刚加载的内容中有一个Ajax“back”链接,则似乎会抛出错误。
更奇怪的是,它适用于我的办公室网络,但它失败如果我在家里或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';
}
?>
答案 0 :(得分:5)
“权限被拒绝”听起来很可疑,好像你有same origin policy个问题一样。
答案 1 :(得分:3)
您处于跨域请求状态。 AJAX请求基本上只能用于服务页面的服务器。因此,如果您的脚本页面是从http://website.com/url
加载的,则可以对http://website.com/
进行任何调用,但对http://url.com
的任何调用都将失败。
话虽如此,如果您运行http://s1.example.com
,可以从http://s2.example.com
致电document.domain = "example.com"
。
但是如果你真的需要跨域访问数据,那么几乎没有办法做到这一点。我所知道的最简单的方法是使用<script>
标记来进行查询。您可以编辑文档,将<script>
标记添加到您喜欢的任何src
,浏览器会转到那里并为您提取脚本。因此,如果你控制http://url.com
,你可以让它创建一个javascript而不是HTML页面,这个脚本将被加载和执行。此方法用于使JSONP工作。
跨站点脚本可能在本地网络中没有安全问题的情况下工作,因为IE在这种情况下没有那么多限制。我怀疑它甚至可以在你的局域网中的任何其他浏览器中使用。
答案 2 :(得分:2)
$home_url
是否与发出XMLHTTP请求的页面位于同一个域中?
权限被拒绝错误几乎总是因为尝试跨域或安全区域请求内容...(http://msdn.microsoft.com/en-us/library/ms537505%28VS.85%29.aspx#xdomain)特别是因为您通过VPN而不是办公室看到它,这听起来喜欢它可能是问题。
我会启动Firebug或其他一些调试工具,让您查看请求是什么。
答案 3 :(得分:2)
鉴于已发布的所有答案。我建议你使用相对的URL。我相信XMLHttpRequest可以在最新的浏览器中跨域。 W3C不久前发布了这个规格。
我相信就是这样:http://www.w3.org/TR/access-control/
如果您想跨域,也可以使用动态脚本标记。这似乎是最受欢迎的。通常,这是通过javascript页面编写回调来实现的,以JSON作为参数。
在浏览器中还有许多其他方法可以启用跨域http,但它们都涉及事先设置,除非您使用代理。您实际上可以使用通过Javascript响应的代理,因此代理也可以位于远程域上。
我在这里有一个例子:
这是另一个专门设置为使用XML资源并使用JSON进行响应的设置。
答案 4 :(得分:0)
if ($_SERVER['HTTP_HOST'] == "mysite.com") {
$home_url = "http://mysite.com/testing/rebrand/";
} else {
$home_url = "http://www.mysite.com/testing/rebrand/";
}
无法在评论中发布此内容,因此请将其放在此处;)
这就是诀窍 - 我在config.php中添加了这个来区分域名。一切现在都可以正常运行。谢谢你们:))
答案 5 :(得分:0)
注意 - 注意
不要使用&#34; http://www.domain.xxx&#34;或&#34; http://localhost/&#34;或&#34; IP&gt;&gt; 127.0.0.1&#34;用于ajax中的URL。 仅使用没有地址的路径(目录)和页面名称。
错误状态:
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;
};