Laravel DataTables配置POST仍报GET方法不支持路由错误
DataTables服务端模式报「路由不支持GET方法」问题排查
报错信息
The GET method is not supported for this route. Supported methods: POST.
已尝试检索到的各类相关解决方案,均未解决问题。
现有代码配置
视图层代码
<table id="loan-details-table" class="table table-striped table-bordered table-sm"> <thead class="thead-global"> </thead> <tbody></tbody> </table> <script type="text/javascript"> // 调用DataTable的方法 function getGeneratedLoanDetails(){ var table = $('#loan-details-table').DataTable({ processing: true, serverSide: true, ajax: { url: '/configurations/penalties/getGeneratedLoanDetails/', dataType: "json", type: "POST", data:{ _token: "{{csrf_token()}}"} }, columns: [ { data: '#' }, { data: 'number' }, { data: 'name' }, { data: 'date_granted' }, { data: 'current_date' }, { data: 'no_of_days' }, { data: 'daily_amortization_amount' }, { data: 'total_amortization_amount' }, { data: 'total_amount_paid' }, { data: 'difference' }, { data: 'days_delay' }, { data: 'interest_rate'}, { data: 'penalty_amount'}, { data: 'action' } ] }); } $(document).ready(function(){ // 延迟加载DataTable setTimeout( function() { getGeneratedLoanDetails(); }, 500); }) </script>
路由层代码
Route::post('/configurations/penalties/getGeneratedLoanDetails/', 'Penalty\PenaltyController@getGeneratedLoanDetails');
问题根因
虽然前端和路由都声明了POST方法,但是几个隐蔽的配置问题会导致请求被自动转成GET:
- 最核心的诱因:URL末尾多余的尾斜杠
/。Laravel对带尾斜杠的POST路由会自动返回301重定向到不带尾斜杠的地址,而浏览器处理301重定向时默认会把POST请求转为GET请求,直接触发方法不支持的报错。 - 版本兼容问题:部分版本的DataTables只识别
method字段配置请求方法,仅写type: "POST"在分页、排序触发二次重绘请求时,会 fallback 为默认的GET方法。 - CSRF传递问题:把CSRF令牌放在POST请求体中时,若请求被中间件拦截触发重定向,也会出现请求方法转换的问题。
- 缓存影响:若之前路由缓存过GET方式的同路径路由,旧缓存会导致新的POST路由配置不生效。
修复步骤
- 移除路由和前端ajax URL末尾的尾斜杠,保证两边路径完全一致:
路由修改为:
前端ajax的url修改为:Route::post('/configurations/penalties/getGeneratedLoanDetails', 'Penalty\PenaltyController@getGeneratedLoanDetails');url: '/configurations/penalties/getGeneratedLoanDetails', - 全局配置AJAX的CSRF请求头,避免单请求传参的兼容问题,在公共脚本段加入:
同时在DataTables的ajax配置中同时声明$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': '{{csrf_token()}}' } });method和type为POST,兼容不同版本的参数识别:ajax: { url: '/configurations/penalties/getGeneratedLoanDetails', dataType: "json", method: "POST", type: "POST" }, - 清除路由缓存,避免旧配置干扰:
在项目根目录执行命令:php artisan route:clear
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

