thinkphp6跨域需正确处理cors头与options预检:推荐路由级allowcrossdomain()、自定义corsmiddleware中间件或官方think-cors扩展,禁用*配合credentials,确保预检响应204/200。

ThinkPHP6 添加跨域接口授权,核心是让后端在响应中正确返回 CORS 相关头信息,并妥善处理浏览器的 OPTIONS 预检请求。不能只写 header('Access-Control-Allow-Origin: *') 就完事——带 Cookie 或自定义 Header 时会直接失败,预检不响应会导致请求卡在 pending。
路由级授权:精准、安全、推荐用于 API 接口
只对指定接口(如 /api/ 开头)启用跨域,不影响后台、命令行等其他路由,也避免全局配置带来的安全隐患。
- 在
route/app.php中定义路由后,链式调用->allowCrossDomain(),必须写在末尾且不能漏括号 - 不传参默认允许所有源:
Route::get('api/user', 'Api/User@index')->allowCrossDomain(); - 需指定前端域名时,传数组:
->allowCrossDomain(['https://admin.example.com', 'http://localhost:3000']) - 前端要带 Cookie 或 Authorization 头,必须显式启用凭据支持,且第一个参数不能含
*:->allowCrossDomain(['https://admin.example.com'], true) - 仅对 HTTP/HTTPS 路由生效;console、event、rpc 类型路由调用无效
自定义中间件:全局统一管控,必须拦截 OPTIONS
适用于全站接口都要跨域,或需动态校验 Origin(比如从数据库读白名单)的场景。关键点是:必须主动响应 OPTIONS 请求,否则浏览器报 405 或静默失败。
- 用命令生成中间件:
php think make:middleware CorsMiddleware - 在
handle()方法开头判断并短路预检:if ($request->isOptions()) { return response('', 204); } - 再设置响应头,注意匹配逻辑:
$response->header('Access-Control-Allow-Origin', $origin);$response->header('Access-Control-Allow-Credentials', 'true');$response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');$response->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With'); - 把该中间件类完整命名空间加到
app/middleware.php的最前面,确保最先执行
使用官方 think-cors 扩展:省心、标准、适合复杂需求
它自动处理预检、Credentials 兼容、Expose-Headers、Max-Age 等细节,比手写中间件更健壮,尤其适合需要灵活白名单或上线环境。
- 安装:
composer require topthink/think-cors - 配置
config/cors.php,明确写域名白名单:'origin' => ['https://your-vue-app.com', 'http://localhost:3000'] - 若需 Cookie 支持,设
'supportsCredentials' => true,同时 origin 不能为* - 在
app/middleware.php中注册:\think\middleware\Cors::class
入口文件兜底:仅限调试或轻量部署
绕过框架中间件机制,在 public/index.php 最早时机注入头信息,适合临时验证或 Nginx 无法透传头的边缘情况。
- 在
require __DIR__ . '/../vendor/autoload.php';后插入 - 先处理 OPTIONS:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); } - 再统一设头:
header('Access-Control-Allow-Origin: https://your-frontend.com');header('Access-Control-Allow-Credentials: true');header('Access-Control-Allow-Methods: GET, POST, OPTIONS');header('Access-Control-Allow-Headers: Content-Type, Authorization');
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











