HTML5 下载属性在从另一台服务器下载时不起作用,即使 Access-Control-Allow-Origin 设置为全部 (*)

HTML5 download attribute not working when downloading from another server, even when Access-Control-Allow-Origin is set to all (*)

我有一个下载 link 像这样:

<a href="foo.xls" download="bar.xls">Foobar</a>

这在同一台服务器上下载文件时工作正常,但当从另一台服务器(在本例中为 Azure blob 存储)下载时,文件名保持为 "foo.xls",即使 HTTP 响应返回以下 header:

Access-Control-Allow-Origin: *

这是设计使然还是可能存在另一个 header 我可以添加到 HTTP 响应以使其正常工作?

是的,CORS header 对 download 属性没有影响是设计使然。只有两种浏览器支持 download 属性,Firefox 和 Chrome,并且这两种浏览器对 cross-origin 文件有不同的策略。

Chrome 版本 prior to 65 实际上确实允许 cross-origin 文件上的 download 属性,没有 CORS headers,但 Firefox 选择不允许,引用潜在 social-engineering 次攻击。

MDN 在 download attribute section for the a tag 下记录了 Firefox 20 的这种行为,此行为此后没有改变。

In Firefox 20 this attribute is only honored for links to resources with the same-origin.


This Bugzilla report 讨论了安全问题和使用 CORS 的可能性。

When the user clicks such a link, the user will be prompted if they want to download. It seems very easy for the user to make the mistake of thinking that something on the original website is being downloaded, and not something from bank.com.


Would it be possible to implement it with same-origin and CORS (Access-Control-Allow-Origin) in mind if you are questioning cross origin security? This is very useful feature for web applications (create Blob using JS and let user download it with some meaningful name)

Google 反对为此使用 CORS。


还有 this Bugzilla report,它总结了他们从其他错误报告中得出的决定。

Also, cross origin downloads are working perfectly in Google Chrome.

是的,我们认为他们这样做是在增加安全漏洞。

Bugzilla 问题似乎 rule-out 将来使用 CORS cross-origin download 属性支持的可能性,但现在使用 CORS header s 不对 download 属性做任何事情。如果其他浏览器开始支持该属性,则有可能达成共识。

为了完整起见,当然还有 Content-Disposition header 可以用来强制从其他域下载,但这不提供与 download 属性。不过它确实有更好的浏览器支持。