Laravel AJAX POST请求返回404错误,求排查原因
我尝试向projects/delete发送AJAX POST请求时,收到POST http://127.0.0.1:8000/projects/delete 404 (Not Found)错误。
AJAX代码
$.ajax({ type: "POST", url: '/projects/delete', data: { _token: '{{ csrf_token() }}', id: id }, success: function(){ thisBtn.closest('tr').fadeOut(); }, error: function(){ alert('Nem sikerült a törlés!'); } });
路由配置
Route::post('/projects/delete', 'TesztController@deleteProject');
控制器代码
public function deleteProject(Request $request) { $project = Project::find($request->input('id')); $project->delete(); return "ok"; }
以下是可能的排查方向:
确认路由是否存在:
运行php artisan route:list命令,查看输出列表中是否有POST /projects/delete这条路由,同时检查对应的控制器和方法是否正确匹配。如果列表中没有该路由,说明路由未被正确加载,检查路由文件是否在Laravel的路由加载范围内。清除路由缓存:
若之前执行过php artisan route:cache生成路由缓存,后续修改路由后需要重新清除缓存才能生效。执行php artisan route:clear命令,再重新测试请求。检查CSRF令牌的有效性:
Laravel的CSRF验证失败有时会返回404状态码而非预期的419。查看页面源码中AJAX请求的Form Data,确认_token的值是否和页面<meta name="csrf-token">标签中的内容一致。如果AJAX代码写在外部JS文件中,{{ csrf_token() }}这种Blade语法不会被解析,需要通过meta标签获取令牌:const csrfToken = document.querySelector('meta[name="csrf-token"]').content; // 然后在AJAX的data中传入 _token: csrfToken验证控制器命名空间:
对于Laravel 8及以上版本,路由中引用控制器需要完整命名空间(除非在路由文件中设置了命名空间前缀)。确认路由中的控制器路径是否正确,比如应该是App\Http\Controllers\TesztController@deleteProject,如果缺少命名空间,会导致找不到控制器从而返回404。确保请求URL路径正确:
避免硬编码URL路径,改用Laravel的路由命名功能生成正确的URL。先给路由命名:Route::post('/projects/delete', 'TesztController@deleteProject')->name('projects.delete');然后在AJAX中使用
route()辅助函数生成URL:url: "{{ route('projects.delete') }}"这样能避免因页面相对路径或部署环境导致的URL错误。
检查控制器依赖是否正确:
确认控制器顶部是否引入了Project模型和Request类:use App\Models\Project; use Illuminate\Http\Request;虽然这不会直接导致404,但如果控制器存在语法错误或依赖缺失,可能引发服务器错误,若服务器配置隐藏错误信息,也可能表现为404。
内容的提问来源于stack exchange,提问作者barabasdani123

