javascript - 即使来源相同,Chrome 也会阻止 iframe 请求作为跨域请求

标签 javascript jquery ajax rest

这个让我难住了。

我有一个具有文件上传/下载区域的网络应用程序。文件通过临时 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/

相关文章:

javascript - 输入字段 - 千位 (1,000) 和小数 (.00) 的财务计算和逗号显示

javascript - 使用 formData 通过 ajax 将图像插入数据库

javascript - PHP、ajax、xml、jQuery - 动态搜索仅返回一个值

javascript - 使用 express.js 和 multer 使用 ajax 进行简单的多部分文件上传

javascript - 回调函数的一些值

javascript - 如何在自定义表单验证器的字段上显示错误?

javascript - 在滚动时触发 css animate 类

javascript - Bootstrap 3 Collapse - 随着类的改变改变图标

javascript - 根据当前页面 URL 打开特定的 Jquery Accordion 面板

javascript - .addClass 在最初加载的元素上