提交前必读(请勿删除本节)
您当前的 newapi 版本
v1.0.0-rc.16(回归引入版本;v1.0.0-rc.15 及更早正常)
提交确认
问题描述
当"首页内容(HomePageContent)"设置为一个 URL 时,首页会用 <iframe> 嵌入该 URL。从 v1.0.0-rc.16 开始,被嵌入页面内通过 @font-face(woff2)加载的自定义字体全部失效,回退为系统默认字体;而直接在浏览器打开同一个 URL 时字体显示正常。rc.15 及更早版本在 iframe 内字体正常。
根因分析
web/default/src/features/home/index.tsx:54 的 URL iframe 带了 sandbox 属性,但缺少 allow-same-origin:
sandbox='allow-forms allow-popups allow-popups-to-escape-sandbox allow-scripts'
缺少 allow-same-origin 时,被嵌文档被浏览器放入唯一 opaque origin(null),即使它加载的是自己同域的资源。而 CSS @font-face 请求字体在浏览器中始终以 CORS 模式发起:正常同源时 origin 匹配直接放行,但现在文档 origin 变成 null,字体请求携带 Origin: null,被嵌页面服务器通常不会为自家静态字体返回 Access-Control-Allow-Origin,于是字体请求被 CORS 拦截 → 回退系统字体。这也解释了为何只有字体受影响、图片等非 CORS 强约束资源正常。
该 sandbox 属性由 commit 0b48ad86(fix(web): render custom HTML and Markdown content consistently (#5760),2026-06-27)在一次"统一 HTML/Markdown 渲染"的重构中随附引入,commit message 未说明为何要给 URL iframe 加 sandbox。git tag --contains 0b48ad86 仅包含 v1.0.0-rc.16;rc.13/14/15 的该 iframe 均无 sandbox 属性,与"rc.15 正常、rc.16 异常"的现象一致。
复现步骤
- 管理层设置 → 首页内容(HomePageContent)填入一个使用了
@font-face 自定义字体的 URL(例如自建营销/落地页)。
- 用无痕窗口访问 new-api 首页,首页以 iframe 加载该 URL。
- 观察被嵌页面字体:rc.16 下回退为系统字体;直接打开该 URL 则字体正常。
- 开发者工具 Network 面板可见 woff2 请求因 sandbox 的 opaque origin 触发跨域被拦截。
预期结果
被嵌页面在 iframe 内应与直接打开时字体表现一致(自定义 @font-face 字体正常加载)。
建议修复
首页内容 URL 由管理员配置(可信来源),在 features/home/index.tsx:54 的 sandbox 值中补上 allow-same-origin 即可恢复被嵌页面真实 origin,同源字体/CSS 恢复正常:
sandbox='allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-scripts'
安全权衡:allow-same-origin + allow-scripts 组合下,被嵌页面脚本理论上可移除自身 sandbox 并以真实 origin 访问同域存储;鉴于该 URL 为管理员配置的可信内容,此组合通常可接受。我将另提 PR 关联本 issue。
相关截图
(如维护者需要,可补充 Network 面板 woff2 跨域拦截截图)
补充说明:本 issue 的代码定位与分析在 AI 辅助下完成,结论均经源码与 git 历史核对。
提交前必读(请勿删除本节)
您当前的 newapi 版本
v1.0.0-rc.16(回归引入版本;v1.0.0-rc.15及更早正常)提交确认
问题描述
当"首页内容(HomePageContent)"设置为一个 URL 时,首页会用
<iframe>嵌入该 URL。从v1.0.0-rc.16开始,被嵌入页面内通过@font-face(woff2)加载的自定义字体全部失效,回退为系统默认字体;而直接在浏览器打开同一个 URL 时字体显示正常。rc.15 及更早版本在 iframe 内字体正常。根因分析
web/default/src/features/home/index.tsx:54的 URL iframe 带了sandbox属性,但缺少allow-same-origin:缺少
allow-same-origin时,被嵌文档被浏览器放入唯一 opaque origin(null),即使它加载的是自己同域的资源。而 CSS@font-face请求字体在浏览器中始终以 CORS 模式发起:正常同源时 origin 匹配直接放行,但现在文档 origin 变成null,字体请求携带Origin: null,被嵌页面服务器通常不会为自家静态字体返回Access-Control-Allow-Origin,于是字体请求被 CORS 拦截 → 回退系统字体。这也解释了为何只有字体受影响、图片等非 CORS 强约束资源正常。该
sandbox属性由 commit0b48ad86(fix(web): render custom HTML and Markdown content consistently (#5760),2026-06-27)在一次"统一 HTML/Markdown 渲染"的重构中随附引入,commit message 未说明为何要给 URL iframe 加 sandbox。git tag --contains 0b48ad86仅包含v1.0.0-rc.16;rc.13/14/15 的该 iframe 均无 sandbox 属性,与"rc.15 正常、rc.16 异常"的现象一致。复现步骤
@font-face自定义字体的 URL(例如自建营销/落地页)。预期结果
被嵌页面在 iframe 内应与直接打开时字体表现一致(自定义
@font-face字体正常加载)。建议修复
首页内容 URL 由管理员配置(可信来源),在
features/home/index.tsx:54的 sandbox 值中补上allow-same-origin即可恢复被嵌页面真实 origin,同源字体/CSS 恢复正常:安全权衡:
allow-same-origin+allow-scripts组合下,被嵌页面脚本理论上可移除自身 sandbox 并以真实 origin 访问同域存储;鉴于该 URL 为管理员配置的可信内容,此组合通常可接受。我将另提 PR 关联本 issue。相关截图
(如维护者需要,可补充 Network 面板 woff2 跨域拦截截图)