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
问题分析
- 路由注册异常:从路由列表可见,原本期望的
DELETE /api/notifications并未注册,反而生成了DELETE api/notifications/destroyAll。这是因为Route::controller分组会自动将空路径的HTTP方法路由映射到同名方法,导致空DELETE路径被错误解析为带方法名的路由。 - URL末尾斜杠触发重定向:服务器端(如Nginx)通常会对带末尾斜杠的URL做301重定向到不带斜杠的版本,而
/api/notifications仅注册了GET方法,因此重定向后会匹配到index方法。
解决方法
- 修正路由注册逻辑
避免依赖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'); }); - 统一请求URL格式
调用API时使用不带末尾斜杠的路径:DELETE /api/notifications,避免服务器触发斜杠重定向。 - 调整服务器配置
检查服务器重写规则,确保API路径不受末尾斜杠重定向影响。例如Nginx中,可针对API路径添加例外:location /api/ { try_files $uri $uri/ /index.php?$query_string; # 禁用末尾斜杠重定向 rewrite ^/(.*)/$ /$1 break; }
内容的提问来源于stack exchange,提问作者burasuk
相关产品推荐
相关产品推荐

