Laravel使用Ajax提交POST请求报MethodNotAllowedException如何解决
问题原因及修复方案
1. 路由路径不匹配(核心导致MethodNotAllowedException的原因)
你的路由定义中不存在/users/store路径:
- web.php里定义的路由路径是
/store,命名为users.store - 但Ajax请求的url写为
/users/store,路径不匹配导致Laravel找不到对应的POST路由,直接抛出方法不允许异常
修复二选一即可: - 直接修改Ajax的url为匹配路径:
url: '/store' - 更稳妥的方案是直接使用路由别名,将Ajax的url修改为
url: "{{ route('users.store') }}",和表单action属性保持一致即可
2. 重复无效路由配置
web.php里重复定义了两次store路由,删掉旧版本写法,只保留适配当前Laravel版本的路由即可:
// 删掉这行旧版控制器调用写法 // Route::post('/store', 'usersController@store'); Route::post('store',[usersController::class, 'store'])->name('users.store');
3. Ajax参数配置错误
你当前把表单数据包裹在数组里,同时设置了processData: false和contentType: false,这两个参数仅在传输FormData二进制数据时需要开启,普通表单对象传参开启会导致Laravel无法正常解析POST参数。
修复后的Ajax相关代码:
// 去掉外层多余的数组[],直接传对象 const user = { "fname": $("input#fname").val(), _token: $("input#token").val(), "lname": $("input#lname").val(), "email": $("input#email").val(), "pass": $("input#pass").val(), "confirm-pass": $("input#confirm-pass").val() }; $.ajax({ url: "{{ route('users.store') }}", // 用路由别名避免路径写错 method: 'post', data: user, // 删掉下面两个错误配置,普通表单提交不需要开启 // processData: false, // contentType: false, dataType: 'json', // 原有beforeSend、success逻辑无需改动 })
4. 可选优化(避免后续出现其他错误)
- 控制器中存储用户密码前需要加密,不要直接存明文:
$user->password = Hash::make($request->pass); - 验证规则新增密码一致性校验:
'confirm-pass' => 'required|min:8|max:20|same:pass' - HTML中按钮闭合标签写错,将
</input>改为</button>
完成以上修改后即可解决405异常,实现Ajax无刷新提交效果。
内容的提问来源于stack exchange,提问作者Hadem
相关产品推荐
相关产品推荐

