小编典典

本地AJAX呼叫远程站点可在Safari中使用,但不能在其他浏览器中使用

ajax

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

为了方便维护网站,我在iMac上运行了网站的本地副本。当我使用Safari时,这工作得很好。但是Firefox,Opera和Chrome拒绝运行。我想这是因为跨域策略。(我无法使用IE对此进行测试,因为IE必须在我的iMac上的虚拟机中运行,因此由于这个原因,无法访问任何本地文件)

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

简而言之:这是我的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>

这是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
    });
};

还有一个事件侦听器,它侦听页面滚动和调整大小并检查其他一些约束(例如:是否已经在进行ajax调用?)。此侦听器呼叫StartAJAX

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

JSON回答:未定义
JSON错误状态:错误
错误:

为什么它可以在Safari中工作,但不能在Firefox,Chrome和Opera中工作?

如何使这些浏览器正常工作?

(我需要在所有浏览器上对其进行测试,因为所有浏览器均以不同的方式呈现相同的html文件,但是我不想在每次更改后都将所有文件上载到服务器只是为了对其进行测试。)

编辑:

在阅读了一些答案之后,我想弄清楚一些事情,显然我还不够清楚:

我正在Webbrowsers中搜索设置

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

我可以告诉你原因:

我只是做了短暂的维护,而且我懒得在编辑后将每个操作的文件上传到远程计算机。网络服务器的设置适合​​实际操作。我不想更改它们(也许在完成我的工作之前忘记所做的更改)。脚本也一样:某些您想更改的部分现在可以正常工作。没有理由触摸Ajax-
Call,因为在生产环境中它们没有错。

我只想让那些愚蠢的浏览器Firefox,Opera和Chrome像Safari一样运行,并正确处理Ajax调用。

顺便说一句:

请问有谁能解释从Firefox,Opera或Chrome浏览器中的另一个域通过Ajax调用数据有何风险,而在Safari中执行相同操作似乎无害?


阅读 297

收藏
2020-07-26

共1个答案

小编典典

chrome有一个插件,它将迫使其忽略安全策略。您也可以使用flags来做到这一点。请注意,请勿浏览启用了此功能的“真实网络”,因为这对您的计算机有安全风险。

FIREFOX

该线程表明在firefox中目前尚无此方法。

歌剧

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

另一种方法是让服务器(http://my.domain.tld)返回正确的标头-具体来说Access- Control-Allow-Origin:

2020-07-26