这个让我难住了。
我有一个具有文件上传/下载区域的网络应用程序。文件通过临时 iFrame 元素在后台下载。这是一个单页 AJAX 应用程序,UI 是用 Javascript、jQuery 编写的,并使用 jQuery.FileDownloader.js 来管理 iFrame。该应用程序通过 HTTPS 运行,站点和下载 URL 位于同一个域中。后端是一个 RESTful 应用程序。这几个月来效果很好。直到今天。
突然间,当尝试在 Chrome 中下载文件时,浏览器报告错误“阻止了来源为 https://example.com 的框架访问跨域框架。”
问题是主站点的来源和 iframe 的来源是完全相同的域。我已确保域和协议(protocol)相同。 Chrome 是唯一抛出跨源错误的浏览器。 IE、Firefox、Opera、Safari……都按预期工作。它仅在 Chrome 中,并且仅在今天。更糟糕的是,没有对浏览器进行任何更新。这真的是自发的。我还通过在隐身模式下运行排除了插件的原因,在这种模式下,我的设置不允许运行任何插件,并禁用了我的防病毒软件。这个问题出现在其他计算机上,在其他位置(不在我们的 LAN 或子网上),所有运行 Chrome。
而且,父框架和嵌入式 iframe 的域同样相同。这只发生在通过 HTTPS 运行的生产服务器上。其他非 HTTPS 站点(例如我们的开发环境、localhost)没有问题。我们的 SSL 有效。由于这是一个单页 AJAX 应用程序,我们试图避免弹出另一个下载窗口。
希望有人可以提供一些建议。提前致谢。
更新:经过进一步研究,我发现解决此问题的方法是将响应 header 中的文件名用双引号引起来。
最佳答案
我已经找到问题的原因了。事实证明,谷歌浏览器在处理文件名中包含逗号的文件时存在问题。通过直接链接下载文件时,Chrome 会报告服务器报告了重复的 header 。这是 Chrome 的一个长期存在的问题,尚未得到解决。其他浏览器不易受此问题影响。不过,这是一个相当容易解决的问题,事实上,当我搜索这个错误时,第一个搜索结果有解决方案:在处理来自 Google Chrome 的请求时从文件名中删除逗号。
但是,这不是直接链接,而是 AJAX 请求,会导致不同的异常。在这种情况下,Chrome 提供的错误是跨源请求异常,这就是导致故障排除如此困难的原因。
因此,tl;dr 的全部内容是删除上传文件名称中的逗号。
关于javascript - 即使来源相同,Chrome 也会阻止 iframe 请求作为跨域请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468011/