我通过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,但左边的圆圈保持灰色,好像它还在等待。
请求确实"失败"并调用我的函数,但没有提供任何有趣的信息(截图中也提供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
})
如果尚未选择任何文件(带有空文件的FormData),POST也将成功。
我还确定通过HTTP而不是HTTPS访问应用程序允许Firefox再次开始工作(尽管我仍然不明白为什么)。失败的组合似乎是HTTPS +文件数据。当错误回调被触发时,我也确认xhr.status = 0和xhr.readyState = 0。
使用ProcMon我能够确定我的请求总是离开Firefox并将其发送到我们的负载均衡器(SSL终止),但永远不会离开负载均衡器(没有匹配的Apache日志条目)。这种配置仍适用于IE和Chrome,因此我不确定Firefox是否正在以负载平衡设备(Cisco ACE)拒绝它们的方式形成请求。
答案 0 :(得分:0)
我们已经确定问题是CISCO ACE设备,我们有SSL终止/负载平衡我们的应用程序。有些东西会破坏数据包数据并阻止请求完成。 Here是引用该问题和要调整的设置的文章。