Laravel 10中如何让OPTIONS请求返回405而非200?
解决Laravel 10中OPTIONS请求未返回405状态码的问题
问题原因
Laravel默认会自动处理OPTIONS请求(作为CORS预检请求的一部分),不会触发MethodNotAllowedHttpException,所以你的异常处理代码无法捕获这种情况,导致OPTIONS请求始终返回200。
解决方案
方法一:修改异常处理类
直接在app/Exceptions/Handler.php的render方法中,先拦截OPTIONS请求并判断当前路由是否允许该方法:
public function render($request, Throwable $e) { // 拦截OPTIONS请求,检查当前路由是否允许该方法 if ($request->isMethod('OPTIONS')) { $route = $request->route(); // 如果路由存在且未允许OPTIONS方法,返回405 if ($route && !in_array('OPTIONS', $route->methods())) { return abort(405); } } if ($e instanceof MethodNotAllowedHttpException) { return abort(404); } return parent::render($request, $e); }
方法二:全局中间件拦截
创建一个专门的中间件来处理OPTIONS请求:
- 生成中间件文件
php artisan make:middleware BlockUnallowedOptions
- 编辑
app/Http/Middleware/BlockUnallowedOptions.php:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class BlockUnallowedOptions { public function handle(Request $request, Closure $next) { if ($request->isMethod('OPTIONS')) { $route = $request->route(); if ($route && !in_array('OPTIONS', $route->methods())) { return abort(405); } } return $next($request); } }
- 在
app/Http/Kernel.php中注册全局中间件:
protected $middleware = [ // 保留原有中间件,添加以下行 \App\Http\Middleware\BlockUnallowedOptions::class, ];
两种方法都可以让未被允许的OPTIONS请求返回405状态码,你可以根据项目需求选择其中一种。
内容的提问来源于stack exchange,提问作者user2338456
相关产品推荐
相关产品推荐

