根本原因是服务器未将非根路径请求兜底至index.html;uni-app H5为SPA,路由由前端JS控制,但Nginx/Apache默认仅返回真实存在的文件,访问如/pages/user/profile时因无对应物理文件而直接404。

为什么刷新 H5 页面会 404
本质是服务器没把非根路径请求兜底到 index.html。uni-app 打包出的 H5 是单页应用(SPA),所有路由由前端 JS 控制,但 Nginx/Apache 默认只返回真实存在的文件。比如访问 /pages/user/profile,服务器找不到这个路径的 HTML 或资源,直接返回 404,根本没机会加载 Vue Router。
Nginx 配置必须加 try_files
这是最常见也最关键的修复点。不能只改前端配置,服务器不配合照样 404。
-
location / { try_files $uri $uri/ /index.html; }—— 这行必须加在 server 块里,且要确保它覆盖你部署的路径范围 - 如果 H5 不在域名根目录(比如部署在
/h5/或/word/),需限定 location 前缀并调整回退路径:location ^~ /word { try_files $uri $uri/ /word/index.html; } - 别漏掉
$uri/(带斜杠),否则访问/user/这类结尾带斜杠的路径仍可能 404 - 修改后记得
nginx -t && nginx -s reload,HBuilderX 的本地预览或 Chrome 直接打开 HTML 文件不走 Nginx,无法验证此配置
manifest.json 里 router.mode 别乱设
mode 是 "history" 还是 "hash",得和你的部署环境对齐,不是越“好看”越好。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 选
"history":URL 干净(无 #),但强依赖服务器配置;publicPath必须匹配实际部署路径,例如部署在https://a.com/h5/,就得设"publicPath": "/h5/" - 选
"hash":URL 带#,但零服务器配置要求,适合静态托管(如 GitHub Pages、又拍云)或临时测试;publicPath通常保持"./" - 别在 manifest.json 里写错字段层级:
{"h5": {"router": {"mode": "history"}}},漏掉router或拼错mode都无效
Apache 和子路径部署的坑
用 Apache 时,.htaccess 很容易因权限或模块未启用失效;子路径(如 /admin/)下部署更易出错。
- 确认服务器启用了
mod_rewrite,且AllowOverride All已在对应目录配置中放开 -
RewriteBase必须与实际部署路径一致:部署在/admin/,就写RewriteBase /admin/;写成/会导致所有请求被错误重写到根目录下的index.html - 伪静态规则末尾的
[L]标志不能少,否则后续规则可能干扰 - Tomcat 用户注意:
web.xml的<error-page>只捕获 404,但无法处理 403 或静态资源 404,不如直接配 rewrite 更可控
真正卡住人的往往不是 mode 选 history 还是 hash,而是 publicPath、Nginx location 范围、RewriteBase 这三者没对齐。部署前务必用 curl 模拟请求,比如 curl -I https://your.com/pages/home/index,看返回是不是 200 + text/html,而不是 404 或 301 重定向到错误位置。


















