论坛 BUG 反馈 插件上传封面图后 OSS 返回 403,开启 Schema 缓存后必现
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 分开配置。

撰写回答

回答被采纳可获得全部悬赏积分 · 支持 Markdown 语法

请先 登录 后回答