Files

55 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 天然不命中。