mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
fix(webui): 服务入口「打开」改用路径形态 + 别名模式不补尾斜杠
验收时发现的**用户可见缺口**:API 早就同时返回 url(子域)与 url_portal (路径),但「服务入口」卡片只用了 url —— 而子域形态在穿透部署下 **恰恰是打不开的那个**(外层只放行一个 Host、三级子域通配证书不匹配)。 用户点「打开」得到坏链接,还会以为是插件的问题。 ## 改动 1. 卡片「打开」优先 url_portal(路径形态): 无 DNS 依赖,单端口穿透 / 子域无证书时都能用。 子域链接保留为次选按钮(局域网内直连时更直观)。 文案补一句说明两者差别(子域需 DNS 能解析 `*.<基域名>`)。 2. **别名模式不再补尾斜杠**(顺带发现的 bug): 原实现给所有 url_portal 无条件加 `/`。前缀模式下对(那是规范形态, 前端靠它算相对路径基准);别名模式下错 —— 那里的 path 是上游真实 路径语义(/api/v1/device 是 /api/v1/device/xxx 的前缀),补成 /api/v1/device/ 会让人误以为存在一个可访问的根。 ## 判据 +2 条:TestProxyServicesOffersBothForms(两种形态都必须给出, 且前缀模式的 url_portal 必须带尾斜杠)、 TestProxyServicesAliasKeepsExactPath(别名模式不得带尾斜杠)。 变异验证(2 条,均按预期打红后还原回绿): - 别名模式也加尾斜杠 → 判红 - 前缀模式不加尾斜杠 → 判红 另修正一条旧判据的期望值:它当年断言的是「所有 url_portal 都带尾斜杠」 (即把 bug 当成契约钉住了)。那条路由正是设备网关(别名模式), 现在改为断言不补尾斜杠,并注明理由。 全量:35 包全绿。
This commit is contained in:
@ -732,7 +732,18 @@ func (h *Handler) listProxyServices(scheme, hostPort, portalHost, domain string)
|
||||
if r.Path != "" {
|
||||
// portalHostWithPort 保证端口恰好出现一次(见其注释:
|
||||
// 生产实例的 Host 自带 :8080,直接追加会拼出 8080:8080)
|
||||
e.URLPortal = fmt.Sprintf("%s://%s%s/", scheme, portalHostWithPort(portalHost, hostPort), r.Path)
|
||||
//
|
||||
// 尾斜杠只给**前缀模式**:那是它的规范形态(访问无尾斜杠会被
|
||||
// 301 补上,见 redirectToTrailingSlash),而且路径形态的前端
|
||||
// 靠它算相对路径基准。
|
||||
// 别名模式**不能**加:那里的 path 是上游真实路径语义
|
||||
// (/api/v1/device 是给 /api/v1/device/xxx 做前缀的),
|
||||
// 补成 /api/v1/device/ 会让人以为有个可访问的根。
|
||||
suffix := ""
|
||||
if r.StripPath {
|
||||
suffix = "/"
|
||||
}
|
||||
e.URLPortal = fmt.Sprintf("%s://%s%s%s", scheme, portalHostWithPort(portalHost, hostPort), r.Path, suffix)
|
||||
}
|
||||
}
|
||||
out = append(out, e)
|
||||
|
||||
Reference in New Issue
Block a user