# 网站 iframe 嵌入 2026-09-24 已为 `https://cadworld.robotquan.com` 开放嵌入。 ## 同事网站接入 ```html ``` 如需自动加载内置机器人,可使用 `https://cadworld-sim.robotquan.com/?robot=lekiwi-v1`。加载不会自动发起模型推理。 - 若父页面自身有 CSP,须在其 `frame-src` 中允许 `https://cadworld-sim.robotquan.com`。 - 默认不用 `sandbox`。若同事必须使用 sandbox,请至少评估 `allow-scripts allow-same-origin`:缺少脚本权限无法运行应用,缺少真实来源会导致同源请求/会话失效;下载等能力需按实际需求额外授权。 - 白名单仅包含精确 HTTPS 来源,不包含 HTTP、非默认端口、其他子域名或任意 `www` 前缀。多层嵌套时,每一层祖先都必须匹配白名单。 - 此设置允许展示和在 iframe 内操作,不授权父页面直接读取 iframe DOM 或调用模型 API。父子页面消息接口未实现。 ## 响应头与会话 已移除 `X-Frame-Options: DENY`,未改成仍会阻止跨来源嵌入的 `SAMEORIGIN`,也不使用已废弃的 `ALLOW-FROM`。CSP 的其他指令不变,仅调整为: ```text frame-ancestors 'self' https://cadworld.robotquan.com; ``` 两个 HTTPS 站点属于相同 schemeful site `https://robotquan.com`,因此沿用 host-only、Secure、HttpOnly、SameSite=Strict 会话 Cookie。API Origin、Fetch Metadata、CSRF 和 CORS 限制不放宽。iframe 自身发出的同源请求通过,父页面直接访问 API 仍被拒绝。 ## 发布与验证 本次为 **OpenResty 响应头热更新**,标识 `20260924T071933Z-iframe`。未重启后端,前后容器 ID 和启动时间相同;应用版本仍为 `20260924T065821Z-language-v2`。 - 本地 `deploy/cadworld/openresty.conf` 同步更新,未来新发布包会保留该白名单。 - 更新前后配置与备份位于服务器 `/opt/cadworld-sim/config-updates/20260924T071933Z-iframe/`,旧配置为 `previous.conf`。 - 已执行 `nginx -t`、reload、公网响应头与浏览器测试。**3/3 通过**:精确允许来源及安全头;允许来源内加载真实线上应用、会话建立/读取/销毁和 CSRF 防护;未授权同站子域名被 CSP 拒绝。 - 浏览器测试只合成指定来源的父页面 HTML,iframe 及 API 均访问真实网站;没有修改同事网站,也不代表已经验证其实际页面的 CSP/sandbox 等设置。 - 未触发付费推理。证据:`build/website-deployment/iframe-20260924T071933Z/`。 ```bash CADWORLD_PRODUCTION_TEST=1 npx playwright test \ -c web_platform/playwright.production.config.ts website.embed.production.spec.ts \ --output=build/website-deployment/iframe-20260924T071933Z/browser ``` 旧发布包及其 manifest 没有被修改。重新发布原始旧包会覆盖热更新的头设置;应使用更新后的源码重新构建发布,或重新应用已验证的头配置。 仅回滚本次响应头(目标主机): ```bash cp -p /opt/cadworld-sim/config-updates/20260924T071933Z-iframe/previous.conf \ /opt/1panel/apps/openresty/openresty/conf/conf.d/cadworld-sim.robotquan.com.conf docker exec 1Panel-openresty-m72w nginx -t && \ docker exec 1Panel-openresty-m72w nginx -s reload ```