Laravel中Axios DELETE请求持续返回404错误求助
Laravel DELETE请求进入控制器仍返回404问题排查
问题描述
在Laravel项目中使用Axios发起DELETE请求时持续收到404错误,已确认路由配置正确、刷新路由缓存,且epHash与fileHash参数无误。测试验证请求已进入PHP控制器方法(在声明$file前生成了文本文件),但仍报错,Laravel日志无相关记录,需要让请求正常执行。
相关代码
PHP控制器代码
public function deleteFile($epHash, $fileHash) { $user = Auth::user(); if (!Auth::check() || !$user->is_admin) { abort(500); } $file = File::findOrFail($fileHash); Storage::delete($file->path . $file->name); $file->delete(); return response()->json([ 'advisors' => Advisor::with([ "user.person.contactInfo", "clients", "clients.person.contactInfo", "clients.spouse", "clients.estatePlans", "clients.estatePlans.files", "user.person", "clients.estatePlans.files.createdBy" ])->get(), ]); }
路由配置
Route::delete('/api/estatePlan/{epHash}/{fileHash}/delete', [Controllers\ClientInfoController::class, 'deleteFile']);
JavaScript代码
deleteFile(epHash, fileHash) { Swal.fire({ title: "Are you sure you want to delete this file?", icon: "warning", showCancelButton: true, confirmButtonText: "Yes", cancelButtonText: "No", }).then((result) => { if (result.isConfirmed) { axios .delete(`/api/estatePlan/${epHash}/${fileHash}/delete`) .then((response) => { console.log("DELETED FILE SUCCESSFULLY"); }) .catch((error) => { console.log(error.response); }); } }); },
排查与解决方案
因为请求已进入控制器方法,说明路由匹配正常,404错误的核心原因是findOrFail($fileHash)抛出的ModelNotFoundException——Laravel会将这个异常默认转换为404响应,且默认不会写入日志。
检查
File模型的主键匹配- 如果
fileHash对应的不是File模型的默认主键(id),而是表中的其他字段(比如hash字段),findOrFail会找不到数据抛出404。需要修改查询逻辑:// 替换原有的$file = File::findOrFail($fileHash); $file = File::where('hash', $fileHash)->firstOrFail(); - 如果
File模型的主键确实是fileHash对应的字段,需要在模型中显式指定:class File extends Model { protected $primaryKey = 'hash'; // 替换为实际主键字段名 public $incrementing = false; // 若主键不是自增整数,必须添加此配置 }
- 如果
验证
fileHash的实际值
在控制器方法开头临时添加日志输出,确认传入的fileHash与数据库中的记录一致:public function deleteFile($epHash, $fileHash) { \Log::info('Received fileHash: ' . $fileHash); // 临时日志 // 原有代码... }查看
storage/logs/laravel.log文件,核对fileHash值是否正确。修正权限错误的HTTP状态码
当前权限不足时返回500(服务器错误)不符合HTTP规范,应改为返回403(禁止访问):if (!Auth::check() || !$user->is_admin) { abort(403); }
内容的提问来源于stack exchange,提问作者parker
相关产品推荐
相关产品推荐

