[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
Source: EstrellaXD/Auto_Bangumi