必须在 manifest.json 的 h5.router.mode 字段设为 "history",base 为空或 "/",并配置 Nginx try_files,否则刷新会 404;uni.navigateBack 在 H5 刷新后失效需兼容处理。

必须改 manifest.json,且只在 h5 节点下配 router.mode,否则无效。 很多人改了但刷新 URL 还带 #/,根本原因是配置位置错、大小写错,或没重启项目。
manifest.json 里 router.mode 必须写对位置和格式
UniApp 的 history 模式开关不走 Vue Router 初始化逻辑,也不在 pages.json 或代码里配——它只认 manifest.json 中的 h5.router.mode 字段。
- ✅ 正确位置:
manifest.json的顶层h5对象内,嵌套router对象 - ✅ 正确写法:
"mode": "history"(全小写,不能是"History"或"HISTORY") - ❌ 常见错误:写在
mp-weixin下、写在顶层、漏掉router一层、用单引号、加了注释导致 JSON 解析失败 - ⚠️ 配完必须重新运行:
npm run dev:h5或 HBuilderX 中「运行 → 运行到浏览器」;热更新不会重载路由模式
运行路径 base 必须为空或 /
history 模式要求所有路由解析都基于站点根路径。如果 base 设为 ./、/myapp 或其他非空值,二级页面刷新就会 404 或白屏。
- ✅ 推荐写法:
"base": ""或"base": "/"(两者等效,都表示根路径) - ❌ 绝对不要写:
"base": "./"、"base": "/h5"(除非你明确配了 Nginx 子目录代理并同步改了try_files) - ⚠️ 注意:uniCloud 前端网页托管默认只支持根目录部署,填了非空
base会导致资源加载 404
Nginx 必须配 try_files,否则刷新就 404
前端能跳转 ≠ 刷新可用。history 模式下,/user/profile 是前端路由,不是真实文件路径。服务器没兜底,就会返回 404 或直接吐出 index.html 的原始文本(MIME 错误导致 JS 不执行)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ✅ 最简 Nginx 配置(根目录部署):
location / { try_files $uri $uri/ /index.html; } - ✅ 子目录部署(如
/h5):location /h5 { try_files $uri $uri/ /h5/index.html; } - ⚠️ 不要用
rewrite+@router这种老写法,容易漏匹配,try_files更可靠 - ? 验证是否生效:直接在浏览器地址栏输入一个深层路由(如
/pages/user/info),回车——如果看到页面正常渲染,说明服务端 fallback 成功
H5 环境下 uni.navigateBack 可能失效
这不是配置问题,而是机制限制:H5 刷新后页面栈清空,getCurrentPages() 只剩当前页,uni.navigateBack 就无路可返。
- ✅ 临时解法:封装一个兼容函数,检测页面栈长度,自动 fallback 到
history.back() - ✅ 示例逻辑:
if (getCurrentPages().length - ⚠️ 注意:微信内置浏览器(尤其 iOS)对
history.pushState的触发不敏感,分享链接可能仍是首页,需配合微信 JS-SDK 强制设置updateAppMessageShareData
真正卡住人的从来不是“怎么开 history”,而是三个地方必须同时对上:manifest 里的字段位置和大小写、base 路径是否为根、Nginx 是否兜底所有路由。少一个,URL 就会突然带 #,或者一刷新就 404 —— 而且错误还不报在控制台里。










