归档C-01路由修复过程记录(状态done)

This commit is contained in:
chunyu
2026-09-15 23:11:18 +08:00
parent e397fae928
commit 5bea33cb19
+54
View File
@@ -0,0 +1,54 @@
# PROGRESS — C-01 路由/代理前缀冲突修复
- 状态:done
- 执行模型:muse-spark-1.3-contributor(AGI 自驱 M1)
- 日期:2026-09-12
- 分支/提交:未提交(工作区另有他模未提交改动:C-02 热榜/C-03 运行器 locales+Home,见遗留 §4)
## 改动文件(本卡)
- `chunyu_project_react/src/App.tsx`(修改):冲突 SPA 路由改名 + 旧路径 SPA 内 `<Navigate>` 重定向(`/api-docs`→`/open-api-docs`、`/api-directory`→`/open-api-directory`、`/api`→`/open-api`、`/api-detail/*`→`/open-api-detail/*`、`/api/<5页>`→`/open-api/<5页>`、`/article/:id`→`/post/:id`、`/user`、`/user/:id`→`/user-home`);新增 `LegacyApiDetailRedirect/LegacyPostRedirect/LegacyUserHomeRedirect` 带参透传
- `chunyu_project_react/src/components/Navbar/Navbar.tsx`、`MobileBottomNav`、`MobileGuard`、`MobileTopNav`、`pages/Home/Home.tsx`、`HomeMobile.tsx`、`pages/Search/Search.tsx`、`pages/ApiDirectory/*`(3)、`pages/ArticleDetail`、`ArticleManage`、`Articles`、`Chat`、`Console`、`Favorites`、`UserHome`(修改):全部 SPA 跳转/link 引用同步新路径
- `chunyu_project_react/vite.config.ts`(重写代理段):宽前缀改为精确正则白名单(`^/api/`、`^/user/`、`^/bug/reports/`、`^/article/(articles|my-articles|comments)/`、`^/learn/(courses|chapters|my-courses|my-progress|materials|favorites|cdn)/`、`^/history/records/`、`^/message/`、`^/chat/(friend-requests|friends|users|conversations|messages|upload|favorite-stickers)/`、`^/tool/`、`^/search/`(有参代理/无参放行)、`^/app/`、`^/logs/api/`、`^/shorturl/`、`/s` 短码形态、`^/user/` 数字 id 放行旧分享);旧分享链接 + SPA 精确路径 bypass 放行
- `chunyu_project_react/nginx.conf` + `vscode/nginx-docker.conf`(同步改写,两文件一致):生产宽正则 `^/(api|user|...)/` 拆分为同 vite 口径的精确 location;`/search/` 按 `$args` 有无分流(`@spa_fallback`);`/user/\d+` 放行旧分享
- `chunyu_project_react/scripts/check_routes.mjs`(新增):86 路由回归脚本(73 新路由 + 13 旧重定向),劫持判定=Django404/后端JSON 且无 `#root`,SPA 到达判定=含 `id="root"`(dev 外壳口径)
- `chunyu_project_react/tests/c01-route-regression.spec.ts`(新增):Playwright 3 项(新路由直访/旧链接重定向/API 代理回归)
## 验收命令与结果
```bash
$ node scripts/check_routes.mjs --base http://127.0.0.1:5174
ROUTES=86 PASS=86 hijacked=0 blank=0
# 首轮 81/86:5 条旧 /api/<页> 被 ^/api/ 劫持 → 补 LEGACY_API_PAGES 放行后 86/86
$ PLAYWRIGHT_BASE_URL=http://127.0.0.1:5174 npx playwright test tests/c01-route-regression.spec.ts
3 passed (4.2s)
# 新路由直访 / 旧链接重定向(/article/1→/post/1、/user/1→/user-home/1、/api-detail/1→/open-api-detail/1)/ API 代理回归全绿
$ curl 经 vite 代理:/api/apidirectory/categories/ → {"code":200,...}; /article/articles/ → {"code":10000,...}; /tool/list/ → 200;/search/hot-keywords/ → 200
$ curl SPA 直访:/open-api、/post/1、/user-home/1 → 均含 id="root"
$ npx tsc -b
TSC_EXIT=0(无输出即通过)
$ npx vite build
✓ built in 13.34s(仅 chunk-size 警告,既有)
$ 残留检查(卡内 grep 口径,排除 API 调用/CSS 类名/重定向本身)
零残留(仅 ApiDirectory.tsx:114 的 EXCLUDED_PATHS "/api-docs/" 是后端 url_path 过滤常量,非 SPA 引用)
$ 生产 nginx 审查:7 条冲突段(5 条 /api/* 数据页 + /article/:id + /user/:id)全部让路
新 /open-api*、/post/*、/user-home* 无一条命中代理 location;nginx -t 未能执行(本机无 nginx 二进制、Docker daemon 未启动),以括号配平(28/28)+ 逐段静态审查代替
```
## 基线对照
- 开工前:`manage.py check` EXIT=0(12 issues:W005×1+W042×11,与 baselines.json 一致);git 工作区已脏(他模 C-02/C-03 改动未提交);dev 22 条劫持(报告值,未复跑旧配置)
- 完工后:86/86 直访 SPA;代理 API 回归 4/4;tsc/build/Playwright 全绿;后端 check 未新增告警
## 遗留问题 / 下一模型注意事项
1. 工作区混有他模未提交改动(`locales/*.json` 热榜/签到词条、`Home.tsx` 热榜卡片、`CodeRunnerPage/`、`utils/request.ts` 2 行等,属 C-02/C-03/C-06)——验收 C-01 时只看本卡文件;提交时建议按卡分批 commit。
2. `/search/` 无参裸路径:vite 走 bypass 放行 SPA,nginx 走 `$args` 分流——后端 `GlobalSearchView` 无参行为(空搜索 vs 400)未改,保持原样。
3. nginx 未做运行时 `-t`(本机无二进制、Docker 未启动)——上线前在 CI/服务器上补 `nginx -t`。
4. `/s` 短码 vs SPA 无冲突(SPA 无 `/s/*` 页面),短码形态 `^/s/[^/]+/?$` 代理;`/settings`、`/shorturl-detail` 天然不命中。