macOS 10.13.4中Safari发送含空文件输入的FormData()时AJAX请求失败
这种特定浏览器版本的兼容性问题真的磨人,尤其是Safari有时候的“特立独行”,结合你已经定位到是10.13.4的Safari独有的问题,给你几个具体的排查和修复方向:
检查Ajax请求的Content-Type头
Safari 10.13.4可能对Content-Type的处理有更严格的要求,比如表单数据提交时,确保你发送的是application/x-www-form-urlencoded而非multipart/form-data(除非有文件上传需求)。Symfony的表单处理对请求头正确性依赖很高,你可以在前端显式设置:$.ajax({ url: '/your/form/route', type: 'POST', data: $('#your-form-id').serialize(), contentType: 'application/x-www-form-urlencoded; charset=UTF-8', // 其他配置项... });验证CSRF令牌的传递逻辑
Symfony 2.8表单默认启用CSRF保护,这个版本的Safari可能在Cookie读取或表单字段令牌传递上有异常。你可以尝试两种调整:- 确认表单里的
_token字段被正确序列化进Ajax请求数据中; - 如果是通过Cookie传递CSRF,检查Safari隐私设置是否阻止了第三方Cookie(跨域场景下),或者显式在Ajax请求中带上Cookie:
$.ajax({ // 其他配置项... xhrFields: { withCredentials: true } });- 确认表单里的
排查请求数据的编码问题
这个版本的Safari对特殊字符(比如中文、特殊符号)的编码处理可能和其他浏览器不同。你可以在前端对表单数据做一次编码处理,或者在Symfony控制器里手动解码:$data = $request->request->all(); // 针对有问题的字段做解码处理 if (isset($data['target_field'])) { $data['target_field'] = urldecode($data['target_field']); }查看Symfony请求日志定位问题
打开Symfony的dev.log(路径一般是app/logs/dev.log),搜索对应路由的请求日志,看看Safari提交请求时是否有CSRF验证失败、参数解析错误等具体异常信息,这能帮你精准定位是请求被拦截还是后端处理出错。尝试调整jQuery版本(如果使用的话)
如果你用了较新的jQuery版本,可能和Safari 10.13.4存在兼容性冲突,试着降级到jQuery 3.3.1这类稳定版本,看看是否能解决问题。模拟Safari请求做后端验证
用Postman或curl模拟该版本Safari的User-Agent发送请求,User-Agent示例:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15,这样可以区分是前端浏览器的问题,还是Symfony后端对该请求的处理逻辑有问题。
既然已经向Apple提交了bug,短期内大概率得不到官方修复,上面的临时方案应该能帮你解决用户的提交问题。
内容的提问来源于stack exchange,提问作者Andrei Herford

