internet-explorer - 当操作 url 是跨域时,Microsoft 浏览器不会将表单发布到 iframe
问题描述
我有一个网站,通过在 iframe 中发布带有目标的表单,将报告导出为各种文件格式,并且 http 响应是一个可以下载的文件。
过去,我的 Web 服务器和 html/js 资产都托管在同一个域中,并且所有浏览器都运行良好。
我只是将我的静态资产移动到不同域上的 cdn,并在我的网站上使用access-control-allow-origin
、x-frame-options allow-from
和content-security-policy frame-ancestors
. 报告导出在 Chrome 和 Firefox 上运行良好,但不再适用于 Microsoft Edge 或 IE 浏览器。
在 Edge 上,开发者工具的网络跟踪显示POST
到服务器的请求是“待定的”并且永远不会完成,但没有请求的服务器日志。在 IE 上,HTTP POST
确实可以正常完成,但浏览器不会提示保存文件。在这两种浏览器上,开发人员工具都显示没有Origin
HTTP 标头,这对于设置x-frame-options
响应至关重要。所以这可以解释为什么 IE 拒绝保存文件。但 Edge 甚至没有提交请求。
我的问题是:
- 为什么边缘不提交 HTTP
POST
? - 为什么两个浏览器都不发送 HTTP
Origin
标头?我应该依赖Referer
标题吗?
解决方案
我最终得出的结论是,将表单发布到 iframe 以下载文件的方法已经过时,并且可能无法得到浏览器的完全支持,尤其是在 cors 场景中。相反,我认为使用 html5 文件 api 可能是更现代的方法,如下所述: https ://stackoverflow.com/a/23797348/1237919
确实,我尝试了这种方法,它在所有浏览器中都很好用!
推荐阅读
- firebase - 如何为第 3 方开发人员构建安全的 Firestore API:SDK 与 Firebase REST API 与 https 函数?
- javascript - 如何使用 ajax 向 Mysql 表添加值
- python-3.x - 字符串字符长度上的 TypeError
- java - 无法使用 os.system() 在烧瓶应用程序中执行 java 代码
- javascript - TypeError:无法读取未定义的属性“描述”
- bash - 使用文件夹名称为子目录中的每个文件添加前缀
- android - 延迟顶页中的背景颜色
- c# - 在打开另一个对话框之前关闭模态对话框(多线程)
- vue.js - Vue - 无法将特定值传递给更高的组件
- android - onNewIntent() 某些 Android 设备上的 TypeCastException