BUG 反馈
已解决
悬赏 100 积分
插件上传封面图后 OSS 返回 403,开启 Schema 缓存后必现
示
示例作者
提问于 2026-10-05 16:23
456 浏览
12 回复
插件封面上传走的是后台的 OSS 直传,上传小于 2MB 的图片一切正常,超过 2MB 必现 403 AccessDenied。排查了一天没找到原因,来请教大家。
环境信息:
- PHP 8.2.14 / Laravel 13.x
DB_SCHEMA_CACHE=true(关闭后问题消失)- OSS Bucket 权限:私有读 + STS 临时凭证
日志里的关键报错:
storage/logs/laravel.log
[OssException] 403 AccessDenied
message: "The OSS Access Key Id you provided does not exist."
STS Token expire: 1970-01-01T00:00:00Z ← 疑点:过期时间被重置
补充:同一份代码在本地(无 Schema 缓存)永远复现不了,切到测试环境开缓存后 100% 复现,怀疑是缓存把 STS 凭证相关的表结构信息缓坏了。
官方已跟进 · 状态:【已解决】
林
林一舟
达人
已采纳
2026-09-14 11:05
这个坑我踩过。根因是:开启 Schema 缓存后,Yii 把表的字段类型信息一并缓存,而插件上传组件在构造 OSS 分片上传参数时用 $schema->getColumnType() 判断附件表字段,缓存里 varchar 长度信息丢失导致签名串里文件大小字段为空,STS 签名校验失败返回 403。
提问者已采纳 · 悬赏 100 积分已发放
风
风间
2026-09-14 14:02
同踩过这个坑,当时排查了半天才发现是 Schema 缓存,太隐蔽了。
白
白鸦
楼主
2026-09-14 14:15
回复 @风间:是的,已按 1 楼方案分离 schemaCache,20MB 上传验证通过
风
风间
2026-09-14 13:48
补充一个排查思路:遇到 OSS 403 先看响应头里的 X-Oss-Request-ID,拿去 OSS 控制台的日志查询里能直接定位到是签名错还是权限错,比盲猜快很多。
白
白鸦
楼主
2026-09-14 15:20
按 1 楼方案改了 schemaCache 分离,20MB 上传也通过了,问题解决 感谢!已采纳并发放悬赏。总结一句:开启 DB_ENABLE_SCHEMA_CACHE 的环境务必把 schemaCache 和业务 cache 分开配置。