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