thinkphp6.1跨域必须严格遵循“预检拦截→头注入→响应输出”三阶段,漏掉任一环节会导致options卡住、405错误或响应静默丢弃;90% cors失败源于后端流程中断而非前端错误。

ThinkPHP6.1跨域请求流程必须严格遵循“预检拦截→头注入→响应输出”三阶段,漏掉任一环节都会导致浏览器卡在OPTIONS、报405错误或静默丢弃响应。你看到的CORS失败,90%不是前端写错,而是后端流程断在了中间。
确认请求是否触发预检
浏览器对非简单请求自动发起OPTIONS预检:Content-Type为application/json、带Authorization头、使用PUT/DELETE方法——这些都会触发。用curl -X OPTIONS -I http://yourdomain.com/api/test验证是否返回204或200,而不是404或500。
若返回405 Method Not Allowed,说明中间件未拦截OPTIONS,或路由未注册该方法,此时后续跨域头根本不会发出。
路由级跨域:只开指定接口,不碰全局
方法一:基础启用(无Cookie)
打开route/app.php,在HTTP路由定义末尾直接链式调用→Route::get('api/user', 'Api/User@index')->allowCrossDomain();
方法二:带Cookie或Token时必须显式声明域名
→Route::post('api/login', 'Api/Login@login')->allowCrossDomain(['https://admin.example.com', 'http://localhost:3000'], true);
【第二个参数true表示启用credentials,此时第一个参数绝不能含*,否则浏览器直接拒绝】
方法三:分组批量启用
→Route::group(['prefix' => 'api', 'middleware' => ['cors']], function () { Route::get('list', 'Api/List@index'); Route::post('create', 'Api/Create@save'); });
全局中间件跨域:统一管控但必须前置拦截
第一步:生成中间件
执行命令php think make:middleware CorsMiddleware
第二步:编辑app/middleware/CorsMiddleware.php,handle方法内按顺序写:
① 开头强制拦截OPTIONS并短路:if ($request->isOptions()) { return response('', 204); }
② 获取可信来源(建议从配置读取,避免硬编码):$origin = config('cors.allow_origin', 'https://your-frontend.com');
③ 设置响应头(注意顺序和完整性):
$response->header([
'Access-Control-Allow-Origin' => $origin,
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Allow-Methods' => 'GET,POST,PUT,DELETE,OPTIONS',
'Access-Control-Allow-Headers' => 'Authorization,Content-Type,X-Requested-With,X-Token'
]);
【Access-Control-Allow-Headers必须精确匹配前端实际发送的字段,少一个就会导致预检失败】
第三步:注册到app/middleware.php最靠前位置
→return [
\app\middleware\CorsMiddleware::class,
// 其他中间件如Session、Auth等放其后
];
验证响应头是否真实生效
用curl -I -H "Origin: https://admin.example.com" http://localhost:8000/api/user 看输出中是否有Access-Control-Allow-Origin: https://admin.example.com这一行。
若仍显示*或缺失,检查是否有多层中间件覆盖:比如JWT验证中间件里也写了header(),会把CorsMiddleware设的头冲掉。
关闭APP_DEBUG = false后测试,避免调试模式下异常中断导致中间件未执行到底。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











