[RFC]反向代理子路径支持

Author: yomiel-sCreated Jul 18, 2026Updated Jul 18, 2026
LabelsRFC

背景 or 问题

部署在反向代理的子路径下时(如 https://myserver.com/bangumi/),前端资源、海报图片、API 调用均404,无法适应此种部署模式。

目标 & 方案简述

目标

通过单一环境变量注入运行时动态 base path,无需重新构建产物。

方案设计

新增环境变量 AB_ROOT_PATH,默认空字符串(行为不变),用户设置为子路径如 /bangumi

数据流: docker -e AB_ROOT_PATH=/bangumi → 后端读取 env,归一化(补前导 /,去尾部 /) → 注入 Jinja2 模板上下文,index.html 中渲染为 window.BASE_PATH → 前端所有路径基于 window.BASE_PATH 拼接

方案设计 & 实现步骤

后端改动:

  • main.py:读取 AB_ROOT_PATH 并归一化,传入 FastAPI(root_path=)(仅用于 OpenAPI schema 正确性,不改变路由)
  • SPA 兜底路由的 Jinja2 模板上下文增加 base_path 变量
  • 新增 /manifest.webmanifest 路由:读取构建产物,替换其中的 /images/ 为正确前缀(PWA 图标适配)

前端改动:

  • index.html<link><style> 中的 /images//fonts/ 绝对路径改用 Jinja2 {{ base_path }} 前缀
  • poster.ts:硬编码 / 前缀改为 window.__BASE_PATH__
  • Vue 组件中所有硬编码 /images/ 路径改为读取 window.__BASE_PATH__
  • Vite 新增 transformIndexHtml 插件:dev 模式下将 {{ base_path }} 替换为空字符串,production build 保留

不变的部分:

  • 健康检查 /health 保持根路径(容器内部使用)
  • Vue Router 使用 hash 模式(#/path),天然不受 base path 影响
  • Axios/SSE 使用相对 URL(如 api/v1/status),浏览器自动基于当前页面路径解析
  • Vite base: './' 不变,JS/CSS 依然相对路径
  • Dockerfile

替代方案 & 对比

No response