我已经开始编写一个使用 JavaScript 显示数据的 HTML 文件。因为它应该尽可能简单地完成,所以我不想运行nodejs或任何其他本地http服务器。我刚刚在浏览器中打开了 HTML 文件(网址为 file:///home/visu/index.htm)。
一切都很好,直到在index.htm中完成对在线API的jquery ajax请求。浏览器阻止请求并显示消息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://x.x.x.x. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing)."
如何在不启动本地 http 服务器的情况下解决该问题?
一个可能的解决方案是使用一些“无安全标志”启动浏览器或使用插件禁用 CORS,但我必须一直手动执行此操作,所以我不喜欢它。
当您的浏览器向与托管当前页面的服务器不同的服务器执行 AJAX 请求时,它首先发送一条 OPTIONS
HTTP 消息。在该消息中,它发送以下标头:
origin: http://my-web-server.com
后端服务器将响应:
access-control-allow-origin: http://my-web-server.com
但是,当您没有网络服务器时,您的浏览器就没有地址可以放入该
origin
标头中。这就是为什么您的浏览器不允许您从本地文件执行任何 AJAX 请求(也许您可以像评论中提到的那样禁用浏览器的 CORS 安全性,但这可能会让您面临恶意网站的风险)。另一种选择
access-control-allow-origin: https://localhost:8888
并且,您还需要告诉本地主机服务器以 HTTPS 而不是 HTTP 方式为您的页面提供服务。一旦满足这两个条件,CORS 验证就不会失败。
请注意,要启用 HTTPS,您需要拥有 SSL 证书和密钥,可以使用以下命令生成它们:
openssl req -x509 -out localhost.crt -keyout localhost.key \
-newkey rsa:2048 -nodes -sha256 \
-subj '/CN=localhost' -extensions EXT -config <( \
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
该命令的来源和更多信息可在
Let's Encrypt 的此页面中找到。
file://
协议的网页)尝试时,CORS 始终
被阻止。您无法执行任何操作来使其从文件中运行。这根本不可能。 这样做的原因是磁盘上的文件没有真正的“来源”来让后端服务器确定请求的有效性。您可以将问题跟踪 html 文件与博客 html 文件放在同一磁盘上。服务器无法知道哪个 html 请求了数据(您甚至可以通过带有嵌入式 javascript 的 Dropbox 共享其他人的文件,当您打开它时,这些文件可能会尝试访问您的服务器数据 - 没有人会想到当他们只是打开一个纯 html 文件时会遭到黑客攻击! !)。
这就是为什么没有浏览器供应商允许您从文件发出 CORS 请求。
您需要一台服务器
local-web-server
。只要协议是 http://
或
https://
,您就可以发出 CORS 请求。一旦您拥有了为 html 文件提供服务的服务器,您就可以像往常一样在后端配置 CORS。
https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/ 以禁用相应选项卡的 CORS。然后,任何请求也适用于 file:///
URI。不过要小心!
<script type="module" src="code.js"></script>
删除类型模块,如下所示:
<script src="code.js"></script>
如果您没有使用 type 模块,并且仍然出现 CORS 错误,解决方案是将所有 .js 文件复制并粘贴到 html 文件中。因此,不要使用加载 js 文件,而是打开标签并将其中的代码添加到 .html 文件中。示例:
<html>
<head>
<script>
// Place your js code here. Just the code, not the file.
// Many files can be contacted here.
</script>
</head>
</html>
观察:最好的解决方案仍然是创建本地服务器,但这是一个解决方案。
如果无法设置access-control-allow-origin,可以尝试这个。
如果您的数据不在同一域中,请使用“回调”功能。 并将您的数据包装为“jsonCallback(“... data ...”) 作为我的示例:http://www.ceducation.cz/akce-plnytext.json?short=1&callback=?
function jsonCallback(json) {
$.each(json, function(key, val) {
// your data is here
console.log('date: ' + val.date);
console.log('address: ' + val.address);
console.log('---');
});
}
$(document).ready(function() {
$.getJSON("http://www.ceducation.cz/akce-plnytext.json?short=1&callback=?", function(data) {
});
});