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

Laravel控制器DELETE方法调用后301重定向至index问题求助

Laravel API DELETE 请求301重定向问题

本地运行正常,但服务器端调用DELETE /api/notifications/时会触发301重定向,最终路由到GET /api/notifications/的index方法。清理缓存、执行composer dump-autoload均无法解决问题。

相关代码与路由信息

路由定义(routes.php)

Route::controller(NotificationController::class)
    ->middleware(['auth:sanctum'])
    ->group(function () {
        Route::get('/', 'index');
        Route::delete('/{id}', 'destroy');
        Route::delete('/', 'destroyAll');
        Route::put('/{id}', 'markAsRead');
    });

控制器代码(NotificationController.php)

class NotificationController extends Controller
{
    /**
     * 获取通知列表
     */
    public function index(Request $request)
    {
        return new NotificationResource($request->user()->notifications->sortBy('read_at'));
    }

    /**
     * 标记指定通知为已读
     */
    public function markAsRead(Request $request, string $id)
    {
        return $request->user()->notifications()->where('id', $id)->first()->markAsRead();
    }

    /**
     * 删除指定通知
     */
    public function destroy(Request $request, string $id)
    {
        return $request->user()->notifications()->where('id', $id)->first()->delete();
    }

    /**
     * 删除所有通知
     */
    public function destroyAll(Request $request)
    {
        return $request->user()->notifications()->delete();
    }
}

RouteServiceProvider 配置

public function boot() {
    Route::middleware('api')
        ->prefix('api/notifications')
        ->group(base_path('routes/routes.php'));
}

生成的路由列表

GET|HEAD api/notifications ..................NotificationController@index 
DELETE api/notifications/destroyAll .........NotificationController@destroyAll 
DELETE api/notifications/{id}................NotificationController@destroy 
PUT api/notifications/{id}...................NotificationController@markAsRead

问题分析

  1. 路由注册异常:从路由列表可见,原本期望的DELETE /api/notifications并未注册,反而生成了DELETE api/notifications/destroyAll。这是因为Route::controller分组会自动将空路径的HTTP方法路由映射到同名方法,导致空DELETE路径被错误解析为带方法名的路由。
  2. URL末尾斜杠触发重定向:服务器端(如Nginx)通常会对带末尾斜杠的URL做301重定向到不带斜杠的版本,而/api/notifications仅注册了GET方法,因此重定向后会匹配到index方法。

解决方法

  1. 修正路由注册逻辑
    避免依赖Route::controller的自动映射,显式确保空DELETE路径正确注册:
    Route::controller(NotificationController::class)
        ->middleware(['auth:sanctum'])
        ->group(function () {
            Route::get('/', 'index');
            Route::delete('/{id}', 'destroy');
            // 显式定义空路径的DELETE路由,规避自动映射
            Route::delete('/', 'destroyAll');
            Route::put('/{id}', 'markAsRead');
        });
    
    或者直接在路由中写全路径,避免前缀分组的影响:
    Route::middleware(['auth:sanctum'])
        ->controller(NotificationController::class)
        ->group(function () {
            Route::get('/api/notifications', 'index');
            Route::delete('/api/notifications/{id}', 'destroy');
            Route::delete('/api/notifications', 'destroyAll');
            Route::put('/api/notifications/{id}', 'markAsRead');
        });
    
  2. 统一请求URL格式
    调用API时使用不带末尾斜杠的路径:DELETE /api/notifications,避免服务器触发斜杠重定向。
  3. 调整服务器配置
    检查服务器重写规则,确保API路径不受末尾斜杠重定向影响。例如Nginx中,可针对API路径添加例外:
    location /api/ {
        try_files $uri $uri/ /index.php?$query_string;
        # 禁用末尾斜杠重定向
        rewrite ^/(.*)/$ /$1 break;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:57:48