Firefox AJAX POST w/ FormData 永远不会完成

Firefox AJAX POST w/ FormData Never Completes

我正在通过 AJAX 和 FormData 上传一个文件作为输入文件控件更改事件的一部分。 $form 变量是对我的表单的 jQuery 引用(如果不是很明显的话)。

$.ajax(url, {
    contentType: false,
    data: new FormData($form[0]),
    method: "post",
    processData: false
}).fail(function(xhr, status, error) {
    console.log(xhr.responseText);
    console.log(status);
    console.log(error);
})

当我在本地测试时,这在 IE、FF 和 Chrome 中有效。将应用程序部署到我们的 QA 环境后,它仅在 FF(50.1.0 64 位)中停止工作。我可以在网络选项卡中看到 POST,但左侧的圆圈保持灰色,好像它仍在等待中。

FF Developer Tools Screenshot

请求确实 "fail" 并调用了我的函数,但没有提供任何有趣的信息(console.log 屏幕截图中的输出也可用)。

我认为这可能是 CORS 问题,但在 about:config 中摆弄并安装 CORS Everywhere 插件并没有产生结果变化。

本地测试和 QA 测试环境之间的显着差异是 QA 环境是负载平衡的 SSL 卸载配置。我们使用的 SSL 证书是一个通配符,意味着它适用于任何站点 *.company.com。本地测试是纯文本。

我确实尝试了 here 提出的一些建议,但无济于事。

我尝试的最后一件事是使用 Fiddler 查看 FF 和应用程序服务器之间发生了什么。当 Fiddler 设置为解密 HTTPS 流量时,该过程开始工作(很奇怪)。当 Fiddler 捕获但不解密 HTTPS 流量时,它不起作用(就像 Fiddler 不是 运行 一样)。这让我相信它可能与证书有关?

我正在寻找有关可能出现问题的建议/想法。

编辑:

我做了进一步的试验并确定提交一个空的 FormData 将 POST 到服务器:

$.ajax(url, {
    contentType: false,
    data: new FormData(),
    method: "post",
    processData: false
})

带有一些垃圾文本键/值对的 FormData 也是如此:

var d = new FormData();
d.append("key", "value");
$.ajax(url, {
    contentType: false,
    data: d,
    method: "post",
    processData: false
})

POST如果尚未选择任何文件(具有空文件的 FormData),也会成功。

我还确定通过 HTTP 而不是 HTTPS 访问应用程序允许 Firefox 再次开始工作(尽管我仍然不明白为什么)。失败的组合似乎是 HTTPS + 文件数据。我还确认 xhr.status = 0 和 xhr.readyState = 0 触发错误回调时。

使用 ProcMon 我能够确定我的请求总是离开 Firefox 并到达我们的负载平衡器(SSL 终止的地方),但从未离开负载平衡器(没有匹配的 Apache 日志条目)。同样的配置仍然适用于 IE 和 Chrome,所以我不确定 Firefox 是否以被负载平衡设备 (Cisco ACE) 拒绝的方式形成请求。

我们已确定问题出在我们的 CISCO ACE 设备上,我们有 SSL 终止/负载平衡我们的应用程序。某些东西正在破坏数据包数据并阻止请求完成。 Here 是参考问题和要调整的设置的文章。