Commit Graph
2 Commits
Author SHA1 Message Date
admin e18eaa2b64 fix(proxy): HTML 外壳也下发 no-cache —— 修「Failed to load plugins」根因(档案 95)
症状:用户页面报
  client-modules: bundle script /plugins/??…&rev=… failed to load  ⇒ 界面「Failed to load plugins」

根因(实测三条对照):
· `GET /`(外壳 HTML)**没有任何缓存头**(无 Cache-Control/ETag/Last-Modified/Expires)⇒ 浏览器启发式缓存
· 外壳内嵌带**内容哈希 `rev`** 的插件 bundle URL;`rev`/模块列表与实例当前状态**必须完全一致**:
  原样 200(11.17 MB)|只改 rev → **404**|rev 对但少一个模块 → **404**
· 于是「改了插件 / 重启了实例」之后,旧外壳永远去请求**已不存在的 rev** ⇒ 404 ⇒ 报错,
  且**普通刷新会命中缓存的外壳 ⇒ 复现不消失**(2026-09-14 事故:当天连铺 4 次插件 + 3 次重启 dshs)

修法:把既有的 `no-cache` 治理(2026-09-12 只覆盖 `/plugins/`、`/assets/`)**扩到 HTML 外壳**——
`String(headers['content-type']).includes('text/html')` 也下发 `Cache-Control: no-cache`。
实例端仍是唯一事实源,平台只加缓存头,不改 rev(R2)。

验证:
· 服务器 `bash scripts/ci.sh` → CI OK(48 pass / 0 fail)
· `scripts/verify-inject.cjs` 新增防回退断言「/plugins/ 与 text/html 都必须 no-cache」
· 经 nginx 公网路径实测 `GET /` → **cache-control: no-cache**(改前为空)
· 端到端:取各用户页面里**自身**的 bundle URL 回拉 → admin/guest 均 200(11.69 / 11.13 MB)

⚠️ 本提交不能回溯治愈「已经坏在用户浏览器里的那份旧外壳」——用户需**强刷一次**
(Ctrl/Cmd+Shift+R,或 DevTools 勾 Disable cache,或无痕窗口)。

⚠️ 同批未提交(属别人 lane,见档案 95 §六):`BRIEF.md` / `DEPLOY-本部署.md` 的配额口径同步
(我改了它们的配额数字,但那两个文件本就有别人未提交的改动 ⇒ 不跟提,宁可保持 dirty)。
2026-09-14 21:50:28 +08:00
admin 43976fea6a 初始提交:DSH 多租户平台(dshs) 2026-09-13 16:18:10 +08:00