Laravel9共享主机部署新增API路由Postman报404错误
Laravel 9 共享主机新增接口404解决方案
问题现状
- Laravel 9项目部署在Hostinger共享主机,原有
AdminController所有接口运行正常 - 新增
PatchController、CustomerController,上传对应控制器、模型文件并替换api.php路由文件后,所有新增接口Postman请求均返回404 - 同代码在本地环境运行完全正常
相关代码
Patch控制器 app/Http/Controllers/Patch/PatchController.php
<?php namespace App\Http\Controllers\Patch; use App\Providers\RouteServiceProvider; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\Patch; use Illuminate\Support\Facades\Hash; class PatchController extends Controller { public function index() { return Patch::all(); } public function create() { // } public function store(Request $request) { $patch= Patch::where('patch_name', $request->patch_name)->first(); if (!$patch) { $request->validate([ 'patch_name'=> 'required', 'emp_id'=>'required', 's_location'=> 'required', 'e_location'=> 'required', 'p_status'=> 'required' ]); return Patch::create($request->all()); } return response([ 'message' => ['This patch already exist.'] ], 404); } public function show($id) { return Patch::where('patch_id',$id)->get(); } public function edit(patch $patch) { // } public function update(Request $request, $id) { $product= Patch::find($id); $product->update($request->all()); $result=$product->save(); if($result) { return ['result'=>'Data has been updated']; } else { return ['result'=>'update operation has been failed']; } return $product; } public function destroy($id) { $product= Patch::find($id); $result=$product->delete(); if($result) { return ['result'=>'Data has been deleted']; } else { return ['result'=>'update operation has been failed']; } return $product; } }
Patch模型 app/Models/Patch.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class Patch extends Model { use HasFactory; protected $fillable=[ 'patch_name', 'emp_id', 's_location', 'e_location', 'p_status' ]; }
路由文件 routes/api.php
<?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\Admin\AdminController; use App\Http\Controllers\Patch\PatchController; use App\Http\Controllers\Customer\CustomerController; Route::group(['middleware' => 'auth:sanctum'], function(){ // 原有正常接口 Route::get('/admins',[AdminController::class,'index']); Route::post('/store',[AdminController::class,'store']); Route::put('/update/{id}',[AdminController::class,'update']); Route::get('/search/{id}',[AdminController::class,'show']); Route::delete('/delete/{id}',[AdminController::class,'delete']); // 新增404接口 Route::get('/patches',[PatchController::class,'index']); Route::post('/c_patch',[PatchController::class,'store']); Route::put('/u_patch/{id}',[PatchController::class,'update']); Route::get('/s_patch/{id}',[PatchController::class,'show']); Route::delete('/d_patch/{id}',[PatchController::class,'destroy']); Route::post('/c_customer',[CustomerController::class,'store']); }); Route::post("login",[AdminController::class,'log']); Route::get('clear', function() { Artisan::call('optimize:clear'); return redirect()->back(); });
解决步骤(按优先级操作,每步完成后测试接口)
清除Laravel全量缓存
这是共享主机部署新增路由404的最常见原因:线上路由缓存存储的是部署时的旧路由记录,新增的路由没有写入缓存,所以全部返回404。
直接在浏览器访问你的域名/clear,触发代码里写的缓存清理逻辑即可。如果该路由无法访问,直接登录Hostinger文件管理器:- 删除
bootstrap/cache目录下所有文件 - 删除
storage/framework/目录下的cache.php、routes.php、config.php缓存文件
有SSH权限的话直接在项目根目录执行命令:
php artisan optimize:clear php artisan route:cache- 删除
核对文件路径、命名大小写
Linux服务器严格区分文件名大小写,Windows本地环境不区分,这是本地正常线上报错的第二高频原因:- 控制器目录名必须大写开头:
app/Http/Controllers/Patch/、app/Http/Controllers/Customer/,不能是小写的patch/customer - 控制器文件名和类名必须完全一致:
PatchController.php、CustomerController.php,不能出现大小写错误、漏写后缀的情况 - 控制器的命名空间必须和目录结构完全匹配,比如Patch控制器命名空间必须是
App\Http\Controllers\Patch
- 控制器目录名必须大写开头:
检查文件权限
所有PHP文件权限设置为644,目录权限设置为755,不要设置777权限,否则共享主机安全规则会阻止文件读取,导致控制器类无法加载。核对请求路径
Laravel的api.php中定义的路由默认自带/api前缀,比如/patches接口的完整请求地址是你的域名/api/patches,不要遗漏/api前缀。另外注意auth:sanctum保护的接口需要携带有效token,未携带token正常返回401而非404,该问题优先级较低。核对文件上传完整性
检查线上的PatchController、CustomerController文件大小、内容和本地完全一致,避免上传过程中文件损坏、内容为空。
内容的提问来源于stack exchange,提问作者Saleem Khan
相关产品推荐
相关产品推荐

