为什么我需要 CORS header 来请求可下载的 link?

Why do I need CORS header to request a downloadable link?

我有一个 link 可以让我在单击文件时下载文件。我没有下载,而是尝试通过一个简单的请求访问它,但是我遇到了 CORS 问题。我无权访问服务器端,因此到目前为止我尝试的一切都失败了。如果我理解正确,到目前为止我发现的所有建议都需要我控制服务器(我可能错了,但据我所知,服务器端需要有一个 CORS header 包括我的域或者有一个要调用的 jsonp 函数)。

这是否意味着我无法读取和解析已可下载的文件?如果是,它有什么意义,因为文件是 public 并且在我单击 link 时已经可以下载。由于我可以手动获取文件,难道不应该可以使用代码访问它吗?你能建议我任何解决方案或给我一些我可以做的事情吗?为什么下面的代码不能像在浏览器上手动点击那样工作?

var urlString = "http://abc.def.com/download?fileid=123&entity_id=123&sid=123";
$.get(urlString, function(data, status){
alert("Data: " + data + "\nStatus: " + status);});

您可以通过手动单击 link 来下载外部脚本,因为您手动单击了它!浏览器知道您授权访问 URL,因为您单击了指向它的 link。但是如果 JavaScript 在后台访问那个 URL,浏览器就不能确定用户是否同意。

你在想"I'm just trying to download an innocent file, why does the browser not trust me??"但是让我们考虑一个更可怕的场景。比方说,您的 JavaScript 没有尝试访问 http://innocentsite.com/download,而是尝试访问 https://bankofamerica.com/initiateMoneyTransfer?recipient=OE1&amount=10000。自从他们在 bankofamerica.com.

上登录后,用户甚至不知道它让你向自己发送了 10,000 美元

现在,显然美国银行(或任何其他受人尊敬的银行)不允许这样发起 10,000 美元的转账。但希望这个例子能传达这个想法——网页能够向其他域发出 HTTP 请求是非常危险的。这就是为什么需要 CORS headers。


脚注:如果您托管自己的网络服务器,您可能会考虑设置代理。你可以在你的网站上有一个 URL 自动从其他网站检索文件,并在你的域上提供它。这样,您就可以检索文件而无需其他网站设置 CORS headers.