仅Firefox浏览器提交表单时Ajax返回400 Bad Request错误求助
问题原因
- 参数位置错误:
$.post()是jQuery封装的快捷POST请求方法,语法规则为$.post(请求地址, 请求体参数, 成功回调函数),代码中错误将请求配置项type、contentType放到了请求体参数中,Chrome浏览器对这类错误参数有自动容错机制,而Firefox会严格执行传参规则,导致WordPress后台的admin-ajax.php无法正确解析到必填的action、_ajax_nonce参数,直接返回400错误。 - 数据格式不匹配:WordPress的Ajax处理接口
admin-ajax.php默认只解析application/x-www-form-urlencoded格式的请求参数,若设置了JSON格式的请求头又没有对应修改后台的参数读取逻辑,后台无法从$_POST全局变量中拿到参数,也会触发400错误。
修复方案
推荐使用WordPress Ajax默认适配的x-www-form-urlencoded格式,无需修改后台原有参数读取逻辑,修复后的前端代码如下:
jQuery(document).ready(function($){ jQuery( 'form[name="contact-me"]' ).on( 'submit', function(e) { e.preventDefault(); var form_data = {}; $(this).serializeArray().forEach( function(element){ form_data[element.name] = element.value; }); $.ajax({ url: zt_send_form_obj.ajax_url, type: 'POST', data: { action: "zt_save_campain_form_data", _ajax_nonce: zt_send_form_obj.nonce, values: form_data }, success: function(data) { if (data.success) { if(data.data.info.message=='no'){ $('#myModal').show(); console.log('cod is in') } if(data.data.info.message=='yes'){ $('#CodeModal').show(); $('.the_cod_div').append('<span>'+data.data.info.code+'</span>'); console.log('data saved'); } } else { console.log("not working"); } } }); }); });
对应后台PHP代码可直接读取$_POST['values']获取数组格式的表单内容,无需再做JSON解析。
如果确实需要使用JSON格式传参,可按以下方式调整:
- 前端配置正确的请求头和参数格式:
jQuery(document).ready(function($){ jQuery( 'form[name="contact-me"]' ).on( 'submit', function(e) { e.preventDefault(); var form_data = {}; $(this).serializeArray().forEach( function(element){ form_data[element.name] = element.value; }); $.ajax({ url: zt_send_form_obj.ajax_url, type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify({ action: "zt_save_campain_form_data", _ajax_nonce: zt_send_form_obj.nonce, values: form_data }), success: function(data) { // 原有回调逻辑不变 } }); }); });
- 后台PHP修改参数读取逻辑,从输入流中解析JSON数据:
$input_data = json_decode(file_get_contents('php://input'), true); $action = $input_data['action'] ?? ''; $nonce = $input_data['_ajax_nonce'] ?? ''; $form_values = $input_data['values'] ?? []; // 后续nonce验证、业务处理逻辑不变
内容的提问来源于stack exchange,提问作者zahra taran
相关产品推荐
相关产品推荐

