# 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 内 `` 重定向(`/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` 天然不命中。