Ajax错误 - “权限被拒绝”

时间:2009-07-29 11:47:58

标签: php ajax iis

对不起,这看起来比它可能更长,但我想我应该包含所有信息!

我正在使用一个简单的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';
}
?>

6 个答案:

答案 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响应的代理,因此代理也可以位于远程域上。

我在这里有一个例子:

http://json-proxy.jgate.de/

这是另一个专门设置为使用XML资源并使用JSON进行响应的设置。

http://jsonproxy.appspot.com/

答案 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;
};