我正在维护一个使用Javascript的网站。该脚本使用jQuery并从通常托管该站点的服务器加载一些内容。
为了方便维护网站,我在iMac上运行了该网站的本地副本。当我使用Safari时,这完全正常。但Firefox,Opera和Chrome拒绝使用。我想这是因为跨域策略。 (我无法用IE测试,因为IE必须在我的iMac上的虚拟机中运行,因此无法访问任何本地文件)
在Firefox和其他浏览器中是否有设置我可以告诉浏览器可以使用本地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>
这是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
。
当它在Safari的本地副本(文件:/// User / ...)上调用StartAJAX
时,我将Ajax内容完美地插入到我的html文档中。在其他浏览器中,我将错误消息插入到html页面中。它是:
JSON-答案:未定义
JSON-Errorstatus:错误
错误:
为什么它在Safari中有效,但在Firefox,Chrome和Opera中无效?
如何让这些浏览器有效?
(我需要对所有浏览器进行测试,因为所有浏览器都会以不同方式呈现相同的html-domument,但我不想在每次更改后将所有文件上传到服务器只是为了测试它。)
在阅读了一些答案之后,我想说清楚一点,我显然不够清楚:
我在Web浏览器中搜索设置
我可以告诉你原因:
我只是做了一个简短的维护,在编辑之后我懒得将每个被操作的文件上传到远程机器。 Web服务器的设置适合实际操作。我不想改变它们(也许在完成我的工作之前忘记了变化)。对于脚本也是如此:那些你想要改变的部分就像现在一样工作正常。没有理由触及Ajax-Calls,因为在生产环境中它们没有任何问题。
我想要的只是那些愚蠢的浏览器Firefox,Opera和Chrome的行为与Safari一样,并正确处理Ajax调用。
请问任何人都可以解释在Firefox,Opera或Chrome中通过Ajax从其他域调用数据的风险很大,而在Safari中做同样的事情似乎无害吗?
答案 0 :(得分:4)
<强> CHROME 强>
有plugin for chrome会强制它忽略安全策略。您也可以使用flags执行此操作。请注意,请不要使用此功能浏览“真实网络”,因为这会对您的计算机造成安全风险。
<强> FIREFOX 强>
This thread表示目前无法在firefox中执行此操作。
<强烈> OPERA 强>
同样,似乎没有内置的方法来忽略CORS策略。
另一种方法是让您的案例中的服务器(http://my.domain.tld)返回正确的标题 - 特别是Access-Control-Allow-Origin:
答案 1 :(得分:0)
假设网站是域A,并且perl脚本位于域B上,您有两个选择: 1)在域B的Web服务器上启用CORS。http://enable-cors.org/ 2)在域A上创建一个脚本(php,perl,ashx等),调用域B上的脚本。域A上的脚本将充当代理,并且将被所有Web浏览器允许。