You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
});

解决步骤(按优先级操作,每步完成后测试接口)

  1. 清除Laravel全量缓存
    这是共享主机部署新增路由404的最常见原因:线上路由缓存存储的是部署时的旧路由记录,新增的路由没有写入缓存,所以全部返回404。
    直接在浏览器访问你的域名/clear,触发代码里写的缓存清理逻辑即可。如果该路由无法访问,直接登录Hostinger文件管理器:

    • 删除bootstrap/cache目录下所有文件
    • 删除storage/framework/目录下的cache.php、routes.php、config.php缓存文件
      有SSH权限的话直接在项目根目录执行命令:
    php artisan optimize:clear
    php artisan route:cache
    
  2. 核对文件路径、命名大小写
    Linux服务器严格区分文件名大小写,Windows本地环境不区分,这是本地正常线上报错的第二高频原因:

    • 控制器目录名必须大写开头:app/Http/Controllers/Patch/、app/Http/Controllers/Customer/,不能是小写的patch/customer
    • 控制器文件名和类名必须完全一致:PatchController.php、CustomerController.php,不能出现大小写错误、漏写后缀的情况
    • 控制器的命名空间必须和目录结构完全匹配,比如Patch控制器命名空间必须是App\Http\Controllers\Patch
  3. 检查文件权限
    所有PHP文件权限设置为644,目录权限设置为755,不要设置777权限,否则共享主机安全规则会阻止文件读取,导致控制器类无法加载。

  4. 核对请求路径
    Laravel的api.php中定义的路由默认自带/api前缀,比如/patches接口的完整请求地址是你的域名/api/patches,不要遗漏/api前缀。另外注意auth:sanctum保护的接口需要携带有效token,未携带token正常返回401而非404,该问题优先级较低。

  5. 核对文件上传完整性
    检查线上的PatchController、CustomerController文件大小、内容和本地完全一致,避免上传过程中文件损坏、内容为空。


内容的提问来源于stack exchange,提问作者Saleem Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:30:27