当前位置: 首页
编程语言
ThinkPHP 8.0 使用CORS中间件解决复杂跨域预检请求

ThinkPHP 8.0 使用CORS中间件解决复杂跨域预检请求

热心网友 时间:2026-07-15
转载

ThinkPHP8 0需创建CORS中间件,拦截OPTIONS预检请求并返回204状态码,设置跨域响应头。中间件必须置于middleware php文件首位。当请求携带凭证时,禁止使用通配符星号,需通过白名单校验请求来源,动态设置Access-Control-Allow-Origin头部,否则浏览器会拦截后续真实请求。

ThinkPHP 8.0 跨域预检失败时,正确配置 CORS 中间件是解决问题的关键:需要拦截 OPTIONS 请求并返回 204 状态码,同时设置 Access-Control 响应头。该中间件必须放置在 middleware.php 数组的首位;当携带凭证时,禁止使用通配符 '*',应通过白名单校验 origin 并动态设置响应头。

ThinkPHP 8.0 使用 CORS 中间件解决复杂跨域请求【Preflight】

当前端发起携带 Authorization 头或 Content-Type: application/json 的请求时,浏览器会自动发送一个 OPTIONS 预检请求。若服务器返回 405 状态码或无响应,则实际请求会被拦截。根源在于 ThinkPHP 8.0 默认未正确处理预检请求,或缺少必要的响应头信息。

创建并注册 CORS 中间件(ThinkPHP 8.0)

执行命令行生成中间件文件:php think make:middleware Cors

打开 app/middleware/Cors.php,将 handle 方法替换为以下内容:

if ($request->isOptions()) {
    return response('', 204)
        ->header('Access-Control-Allow-Origin', $request->header('origin') ?: '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Headers', 'Authorization, Content-Type, X-Requested-With')
        ->header('Access-Control-Allow-Credentials', 'true');
}
$response = $next($request);
$response->header('Access-Control-Allow-Origin', $request->header('origin') ?: '*');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$response->header('Access-Control-Allow-Headers', 'Authorization, Content-Type, X-Requested-With');
$response->header('Access-Control-Allow-Credentials', 'true');
return $response;

关键:必须将 Cors::class 放置在 app/middleware.php 数组最前面,否则 SessionMiddleware 或 JWT 验证中间件可能提前输出响应,导致 headers already sent 错误。

处理带凭证(Cookie/Auth)的跨域请求

前端设定了 credentials: 'include',但浏览器会报错 “Credentials flag is true, but the 'Access-Control-Allow-Origin' value is not the literal '*'”——这是硬性限制,无法绕过。

第一步:禁止使用通配符 * 作为 Access-Control-Allow-Origin 的值。

第二步:动态读取 Origin 请求头,并仅允许白名单域名通过:

$origin = $request->header('origin');
$allowedOrigins = ['https://admin.example.com', 'http://localhost:3000'];
$origin = in_array($origin, $allowedOrigins) ? $origin : null;

第三步:仅当 $origin 不为 null 时才设置响应头,否则不返回任何 CORS 头——避免暴露敏感策略。

第四步:显式启用凭据支持:$response->header('Access-Control-Allow-Credentials', 'true');

验证 OPTIONS 预检请求是否生效的三种方法

方法一:用 curl 手动触发预检请求:

curl -I -X OPTIONS http://your-domain.com/api/v1/users

检查响应中是否包含 Access-Control-Allow-Origin 且状态码为 204

方法二:在 Chrome 开发者工具 Network 标签页中,筛选 OPTIONS 请求,点击查看 Response Headers 区域。

如果看到 HTTP/2 404HTTP/2 500,说明路由未匹配到 OPTIONS 方法,此问题并非中间件导致,而是路由层缺失处理路径

方法三:临时在中间件 handle 开头加一行 file_put_contents('/tmp/cors.log', "OPTIONS hit\n", FILE_APPEND);,然后发起跨域请求,检查日志是否写入——能写入说明中间件已执行,失败点在于 header 设置或响应返回环节。

来源:https://www.php.cn/faq/2818064.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Linux route命令详解:查看与修改IP路由表

Linux route命令详解:查看与修改IP路由表

route命令源自net-tools工具包,用于查看和修改Linux内核IP路由表,但自2009年起已废弃,现代推荐使用iproute命令。由于历史惯性,route仍在生产环境大量存在,且仅能操作main表,需注意新发行版默认未安装。

时间:2026-07-15 18:52
Python部署Scikit-learn模型为FastAPI微服务

Python部署Scikit-learn模型为FastAPI微服务

部署Scikit-learn模型为FastAPI微服务时,需用joblib加载模型,请求体应为二维数组,并添加输入校验(类型转换、维度检查、NaN过滤),生产环境使用uvicorn多worker启动,配合错误处理与日志记录,确保服务稳定高效。

时间:2026-07-15 18:51
CentOS系统中实现Golang日志自动轮转的配置方法

CentOS系统中实现Golang日志自动轮转的配置方法

在CentOS上使用logrotate管理Golang应用日志轮转:安装后编写配置文件,设置每天轮转、保留7份、压缩、不处理空日志,创建新日志权限640;手动测试配置无误后通过cron每日自动执行,实现日志按天切分、压缩与清理。

时间:2026-07-15 18:51
如何高效解决SQL中IN子句超过1000个元素的限制

如何高效解决SQL中IN子句超过1000个元素的限制

针对Oracle等数据库IN子句1000项上限,可通过子查询、分批执行、EXISTS关联子查询等方案突破限制,兼顾查询性能与可维护性,避免字符串拼接反模式,同时提升SQL灵活性与数据库兼容性。

时间:2026-07-15 18:51
CentOS Java日志记录速度优化与性能提升指南

CentOS Java日志记录速度优化与性能提升指南

在CentOS环境下优化Java日志记录速度,需采用Log4j2异步日志解耦业务线程,生产环境日志级别设为WARN或ERROR,配合日志轮转与SSD存储;调整缓冲区大小、简化格式化、优化JVM堆与GC策略,并利用无锁设计避免锁竞争。通过监控工具定位瓶颈,分布式系统可引入集中式日志收集。

时间:2026-07-15 18:51
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜