在反向代理之后发布 Web UI
English | 中文
dsh --profile web 在 loopback 端口上以明文 HTTP 提供 GUI,因此其他机器上的浏览器无法访问它,进程也无从得知你实际使用的地址。它前面的反向代理拥有这条外部链路——公开主机名、TLS,以及转发到监听器之前剥离的路径前缀——--public-url 则告诉 DSH 浏览器使用的是哪个地址:
dsh --profile web --public-url https://app.example/ui/ --trusted-host app.example--public-url 公告什么
--public-url 接受可带挂载前缀的 http:// 或 https:// 根,并把它归一化为以 / 结尾。它提供打印与打开的启动 URL、DSH_WEB_URL 与 web 表层定位。webserver 继续提供 origin-root 路由,且从不了解挂载。publicUrl 配置字段发布同样的公告。
代理必须做什么
- 保留浏览器可见的
Host。 栅栏把收到的Host与被接受的 authority 比对,因此代理应原样转发,而不要改写成监听器的地址。 - 剥离挂载前缀。 监听器应答的是 origin-root 路由,因此对
/ui/api/...的请求必须以/api/...抵达。 - 转发升级请求。 页面发出的每个请求与 WebSocket 升级都必须连同其
Upgrade与Connection头抵达监听器;代理对外提供 HTTPS 时,TLS 在其外部链路上终止。 - 改写 cookie 作用域。 后端始终签发不带
Secure的 host-onlyPath=/cookie;代理把Path改写为挂载(/ui/),并仅在其 HTTPS 链路上添加Secure。 - 重定向裸挂载。
/ui/是唯一入口:只有它把启动 token 换成会话 cookie;已持有该 cookie 的浏览器可由它或/ui/index.html取得文档,因为所提供的文档以自身目录解析 URL。对/ui的请求必须以/ui/抵达,而被剥离路径的后端无法重建该外部路径。
信任浏览器使用的 authority
栅栏接受 loopback,以及每个由 --trusted-host 点名的 authority。浏览器若以其他任何 authority 访问部署,无论代理多么正确,每个 API 调用都会得到 403,因此请用 --trusted-host 点名浏览器可见的 authority;用 --public-url 公告它只是展示,并不等于接纳。不带端口的条目匹配任意端口,适合每次绑定不同端口的隧道。栅栏只放行请求;打印 URL 中的启动 token 与签名会话 cookie 才完成认证。
无论是公告 URL 还是栅栏都不保护监听端口本身,因此请把端口限制在可信代理或网络内。
保护外部链路
在代理处终止 TLS。http:// 公告根会以明文发送启动 token 与会话 cookie,而 https:// 根只加密浏览器到代理这一段。打印的 URL 携带进程凭据,只应与预期用户分享。
Web 应用参考负责 --public-url 与 --trusted-host 的命令行约定,以及 publicUrl 与 trustedHosts 字段。