本地AJAX呼叫远程站点在Safari中工作,但在其他浏览器中不起作用

Hub*_*ast 8 javascript ajax jquery cross-browser cross-domain

我正在维护一个使用Javascript的网站.该脚本使用jQuery并从通常托管站点的服务器加载一些内容.

为了方便维护网站,我在iMac上运行了该网站的本地副本.当我使用Safari时,这完全正常.但Firefox,Opera和Chrome拒绝使用.我想这是因为跨域策略.(我无法使用IE测试,因为IE必须在我的iMac上的虚拟机中运行,因此无法访问任何本地文件)

在Firefox和其他浏览器中是否有一个设置,我可以告诉浏览器ajax加载位于远程服务器上的文件是否可以使用本地javascript从本地html页面加载?

简而言之:这是我的html页面:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>some title</title>
        <link rel="stylesheet" type="text/css" href="../css/stylesheet.css">
        <script src="../js/jquery-2.1.3.min.js"></script>
        <script src="../js/myScript.js"></script>
    </head>
    <body>
        <!-- some content with a div-container to receive the ajax-content -->
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是myScript.js:

var errorMsg = function (msg) {
    //insert the message into the html-page
};

var JSONerror = function (jqXHR, textStatus, errorThrown ) {
    var msg = 'JSON-answer: '+jqXHR.responseText;
    msg += '<br>'+'JSON-Errorstatus: '+textStatus;
    if ($.type(errorThrown) === 'string') {
        msg += '<br>'+'Error: '+errorThrown;
    }
    errorMsg(msg);
};

var JSONreceive = function (JSONobj, StatusString, jqXHR) {
    //insert the data in JSONobj into the html-page
}

var StartAJAX = function () {
    $.ajax({
        url: 'http://my.domain.tld/cgi-bin/myPerlScript.pl',
        data: "lastID=" + lastID
           + '&qkz=' + Math.random(),
           dataType: "json",
           success: JSONreceive,
           error: JSONerror
    });
};
Run Code Online (Sandbox Code Playgroud)

还有一个事件监听器,它监听页面滚动并调整大小并检查一些其他约束(例如:是否已经有ajax调用正在进行中?).这个听众打电话StartAJAX.

当它StartAJAX在Safari中调用我的页面的本地副本(文件:/// User/...)时,我将Ajax内容完美地插入到我的html文档中.在其他浏览器中,我将错误消息插入到html页面中.它是:


JSON- 答案:未定义JSON-Errorstatus:错误
错误:

为什么它在Safari中有效,而在Firefox,Chrome和Opera中无效?

如何让这些浏览器工作?

(我需要用所有浏览器测试它,因为所有浏览器都以不同的方式呈现相同的html-domument,但我不想在每次更改后将所有文件上传到服务器只是为了测试它.)

编辑:

在阅读了一些答案之后,我想说清楚一点,我显然没有说清楚:

我在Webbrowsers中搜索设置

  1. 我不会更改我的远程网络服务器(Apache)的设置
  2. 我不会操纵我的远程机器上的任何文件(.htaccess)
  3. 我不会在我的本地iMac上设置网络服务器
  4. 我不会在我的Javascript文件中更改AJAX调用的代码
  5. 我不会更改远程服务器上的Perl-Scripts的代码

我可以告诉你原因:

我只是做了一个简短的维护,我懒得在编辑后将每个被操作的文件上传到远程机器.Web服务器的设置适合​​实际操作.我不想改变它们(也许在完成我的工作之前忘记了变化).对于脚本也是如此:那些你想要改变的部分就像现在一样工作正常.没有理由触及Ajax-Calls,因为在生产环境中它们没有任何问题.

我想要的只是那些愚蠢的浏览器Firefox,Opera和Chrome表现得像Safari并正确处理Ajax调用.

BTW:

请问任何人都可以解释在Firefox,Opera或Chrome中通过Ajax从其他域调用数据的风险很大,而在Safari中做同样的事情似乎无害吗?

Rob*_*Rob 5

铬合金

chrome有一个插件可以强制它忽略安全策略。你也可以用flags做到这一点。请注意,请不要在启用此功能的情况下浏览“真实网络”,因为这会给您的计算机带来安全风险。

火狐

该线程表明目前无法在 Firefox 中执行此操作。

歌剧

同样,似乎没有内置的方法可以忽略 CORS 策略。

另一种方法是让服务器(http://my.domain.tld)在您的情况下返回正确的标头 - 特别是Access-Control-Allow-Origin: