mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-26 20:33:15 +00:00
用户指出 webui 实际是经 https://homeagent.jianfgit.xyz/ 穿透出去的, 应当支持配置 base URL。实测确认了这个诉求的正当性。 ## 实测发现的约束(决定方案) 1. **子域形态在外部不可用**:`*.homeagent.jianfgit.xyz` 泛解析存在, 但外层只给 `*.jianfgit.xyz` 通配证书 —— 该证书**不匹配三级子域**, 实测 `huawei-smarthome.homeagent.jianfgit.xyz` 外部握手失败(HTTP 000)。 外层只放行 `homeagent.jianfgit.xyz` 这一个 Host。 2. **路径挂载形态外部可用**:实测 `https://homeagent.jianfgit.xyz/api/v1/device/online` → 200。 所以「一个外部 Host + 路径挂载」是这条链路的正解,且已经工作。 3. 外层 nginx/WAF 会带 `X-Forwarded-Proto: https` 与 `X-Forwarded-Host`, 因此即使不配置也能推出正确链接;配 base_url 则是显式兜底。 ## 新增设置项 base_url 三级优先解析「对外入口」(resolveEntry): 1. **配置项 base_url** —— 外部入口是部署事实,不该靠请求猜。 经多层网关时请求可能带内网 Host,按它推导会拼出用户点不开的链接。 2. **X-Forwarded-Proto / X-Forwarded-Host** —— 反代层给权威信息时可靠。 3. **请求自身** —— 直连时的正确来源。 base_url 的主机名同时用作**子域反代的基域名**:入口是 homeagent.example.com 时,插件服务自然是 <标签>.homeagent.example.com。 服务清单另增 entry_url 字段,直接给出「外部入口是什么」,便于前端与排错。 ## 生效点 - `/api/v1/proxy/services`:url / url_portal / base_domain / entry_url - `/api/v1/device/gateway`:url / url_portal / http_url / host - 两处原先各自推导 portalHost,现统一走 resolveEntry,避免再次漂移 ## 部署后实测(生产,经真实外部入口) entry_url: https://homeagent.jianfgit.xyz base_domain: homeagent.jianfgit.xyz remotedevice | https://devices.homeagent.jianfgit.xyz | https://homeagent.jianfgit.xyz/api/v1/device/ ← 外部可点 huawei_smarthome| https://huawei-smarthome.homeagent.jianfgit.xyz 发现端点(外部视角): url_portal = wss://homeagent.jianfgit.xyz/api/v1/device/ws ← 外部可连 ## 判据 +3 条:TestBaseURLOverridesRequestDerived(内网 Host 场景下必须用 base_url)、 TestEntryPrefersForwardedHeaders(XFF 优先于请求自身)、 TestBaseURLTolerant(尾斜杠/空格容错 —— 手填配置最常见的两种手误)。 另更新一条旧判据的期望值:外部入口是 portal.example.com 时,子域基名应取 **实际入口**而非本机配置的 localhost(后者对远程用户无意义)。