繁体   English   中英

Ajax错误 - “权限被拒绝”

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

我在这里有一个例子:

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

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

http://jsonproxy.appspot.com/

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM