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

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请求:

  1. 生成中间件文件
php artisan make:middleware BlockUnallowedOptions
  1. 编辑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);
    }
}
  1. 在app/Http/Kernel.php中注册全局中间件:
protected $middleware = [
    // 保留原有中间件,添加以下行
    \App\Http\Middleware\BlockUnallowedOptions::class,
];

两种方法都可以让未被允许的OPTIONS请求返回405状态码,你可以根据项目需求选择其中一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:58:13