AJAX上传图片提交FormData到Laravel托管服务器请求参数为空本地正常
重要提示!该问题仅出现在托管服务器上,本地环境上传完全正常
排查及解决方案
- 检查服务器层面的上传限制
先通过phpinfo()确认托管服务器的PHP配置参数upload_max_filesize、post_max_size是否大于你设置的500KB文件限制。如果使用Nginx作为Web服务器,还要检查client_max_body_size配置是否足够;使用Apache的话检查LimitRequestBody参数配置。 - 排查请求重定向丢失payload问题
托管环境通常会配置HTTP强制跳HTTPS、www域名跳非www域名这类规则,如果你的AJAX请求地址和当前页面访问的协议、域名不一致,触发301/302重定向时,POST请求的请求体会被自动清空,请求方法也会转为GET。
解决方法:直接把AJAX请求的url改为和当前页面完全一致的协议域名前缀,或者修改Web服务器的重定向规则为307重定向(307重定向会保留原请求方法和请求体)。 - 补充CSRF请求头
你当前的AJAX请求未携带Laravel要求的CSRF令牌,本地环境可能关闭了CSRF校验或者配置宽松才未触发问题。可以先在页面头部添加meta标签:
然后在AJAX配置里添加请求头参数:<meta name="csrf-token" content="{{ csrf_token() }}">headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')} - 验证原始请求内容
可以在控制器最开头打印原始请求输入,判断是服务器层面清空了请求还是Laravel解析问题:
如果输出为空,说明请求在到达PHP之前就已经被Web服务器或者托管侧的安全WAF拦截清空了,可以联系主机商确认安全规则配置。如果有输出,说明是Laravel侧的中间件修改了请求,检查dd(file_get_contents('php://input'));app/Http/Kernel.php里注册的全局中间件是否有对上传请求做过滤处理。
内容的提问来源于stack exchange,提问作者MuAf
相关产品推荐
相关产品推荐

