options请求返回405是因为thinkphp未拦截预检请求,需在中间件handle()开头添加if ($request->isoptions()) { return response('', 204); }短路逻辑,禁用method_filter或将其加入白名单,并确保cors中间件注册于全局中间件数组首位。

OPTIONS 请求返回 405,说明 ThinkPHP 没有正确拦截或响应预检请求,而是把它当作非法方法直接拒绝了。这不是跨域头没加对,而是请求根本没走到你设头的逻辑里。
必须在中间件开头主动拦截 OPTIONS
ThinkPHP 默认不处理 OPTIONS 方法,尤其开启 method_filter 或使用资源路由时,会直接抛出 405。解决方式不是等它进控制器,而是在中间件 handle() 最开始就短路:
- 加判断:
if ($request->isOptions()) { return response('', 204); } - 用 204 状态码,不是 200;空响应体更规范,避免 CDN 或代理误处理
- 千万别写
return $next($request)后再处理——那已经晚了,可能已触发 405
检查 method_filter 配置
打开 app/config/app.php,确认以下两项之一已设置:
-
'method_filter' => false(最简单) - 或保留为 true,但把
'OPTIONS'加入白名单数组:'method_filter' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
否则框架会在路由匹配前就拦截掉 OPTIONS,中间件根本不会执行。
确保中间件注册位置靠前
在 app/middleware.php 的全局中间件数组中,CORS 中间件必须放在第 1 或第 2 位:
- 不能在 Session、JWT 验证、权限中间件之后——它们可能提前终止请求
- 不能写成
'cors'或自定义类名,要严格用\think\middleware\Cors::class(如用官方内置)或你自己的中间件完整命名空间 - 多应用模式下,需在对应应用的
app/middleware.php中配置,不是根目录那个
别让 Nginx 或 Apache 拦截 OPTIONS
Web 服务器层可能比 PHP 更早拒绝 OPTIONS:
- Nginx 检查是否有类似
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; }的规则,删掉或补上 OPTIONS - Apache 检查
.htaccess是否禁用了 OPTIONS,或mod_rewrite规则是否跳过它 - 用
curl -X OPTIONS -I http://your-api.com/api/test直接测真实响应,绕过浏览器缓存和前端干扰
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











