4.8 KiB
4.8 KiB
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 代理回归)
验收命令与结果
$ 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 checkEXIT=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 未新增告警
遗留问题 / 下一模型注意事项
- 工作区混有他模未提交改动(
locales/*.json热榜/签到词条、Home.tsx热榜卡片、CodeRunnerPage/、utils/request.ts2 行等,属 C-02/C-03/C-06)——验收 C-01 时只看本卡文件;提交时建议按卡分批 commit。 /search/无参裸路径:vite 走 bypass 放行 SPA,nginx 走$args分流——后端GlobalSearchView无参行为(空搜索 vs 400)未改,保持原样。- nginx 未做运行时
-t(本机无二进制、Docker 未启动)——上线前在 CI/服务器上补nginx -t。 /s短码 vs SPA 无冲突(SPA 无/s/*页面),短码形态^/s/[^/]+/?$代理;/settings、/shorturl-detail天然不命中。