必须在manifest.json的h5节点下配置{"mode":"history"},大小写敏感且需重新运行项目;刷新404主因是服务器未fallback至index.html,须配合nginx的try_files规则或改用hash模式。

直接改 manifest.json 里的 router.mode 为 "history" 就能去掉 #,但改完立刻刷新页面报 404 —— 这不是配置错了,是服务器没接住请求。必须前后端一起动,缺一不可。
怎么在 manifest.json 里启用 history 模式
打开项目根目录的 manifest.json,确保 h5.router 节点存在且配置正确:
-
mode必须设为"history"(注意是字符串,不是布尔值) -
base推荐设为"/";如果部署在子路径(如/h5/),则必须同步设为"/h5/",否则路由跳转和静态资源加载都会出错 -
publicPath和base要保持一致,否则构建后 JS/CSS 路径 404 - 改完必须重新运行 H5(关掉浏览器窗口再点「运行到浏览器」),否则缓存会掩盖效果
为什么刷新就 404?Nginx 怎么配才不丢请求
history 模式下,/user/profile 是前端路由,但服务器默认只找真实文件。用户直接访问或刷新时,Nginx 会尝试返回 /user/profile/index.html 或 /user/profile 文件 —— 显然不存在,于是返回 404。
- 核心解决逻辑:所有非静态资源请求(即非
.js、.css、.png等后缀)都 fallback 到/index.html - 标准 Nginx 配置段:
location / {<br> try_files $uri $uri/ /index.html;<br>} - 如果部署在子目录(如
https://a.com/h5/),要严格匹配前缀:location /h5 {<br> alias /www/wwwroot/my-site/h5/;<br> try_files $uri $uri/ /h5/index.html;<br>}注意:alias和root行为不同,混用会导致资源 404 - 确认构建产物中
index.html确实存在于目标路径,且权限可读
不能改服务器时的替代方案
如果你用的是 GitHub Pages、Vercel、Netlify 或公司内无法修改 Nginx 的静态托管环境,history 模式基本不可行。这时候别硬扛,换回 hash 模式更实际:
- 在
manifest.json中显式设:"h5": {<br> "router": {<br> "mode": "hash"<br> }<br>} - URL 会变成
https://a.com/#/pages/user/profile,# 后内容由前端完全接管,服务器零配置 - 注意微信内嵌浏览器对
hashchange有兼容性问题,部分旧版本可能触发两次路由,若业务强依赖微信,需加防抖 - 这个方案适合快速验证、临时上线、或纯内部使用的 H5 页面
真正难的从来不是改那一行 mode: "history",而是确认服务器是否允许你写 try_files,以及 base 和 publicPath 是否在所有构建环节(开发、测试、CI、CD)中始终保持一致 —— 差一个斜杠,就可能让整个路由系统失效。











