Nginx + Vue History 模式刷新 404 的完整排查与解决方案

一、问题背景

在部署前后端分离项目时,常见架构如下:

  • 前端:Vue 3(使用 createWebHistory,History 模式路由)

  • 后端:Spring Boot

  • 网关:Nginx

部署完成后,发现一个非常诡异的问题:

👉 页面内部跳转一切正常,但只要在浏览器地址栏刷新,就直接 404。

例如访问:http://ip:port/finance-record

  • 首次从首页点击跳转 → 正常显示

  • 浏览器刷新 → 404 Not Found

二、问题复现

现象:

操作 结果
/finance-record 页面内跳转 正常
直接访问 /finance-record 404
刷新 /finance-record 404

三、问题根因分析

1️⃣ Vue History 模式的本质

History 模式下:

  • /finance-record 只是前端路由

  • 服务器实际上并不存在 /finance-record 这个文件

👉 所以:服务器必须把所有非静态资源请求回退到 index.html,交给前端路由处理。

2️⃣ 刷新时发生了什么?

浏览器刷新 /finance-record 时:

  1. 请求直接发送给 Nginx

  2. Nginx 尝试寻找文件:/path/frontend/dist/finance-record

  3. 文件不存在 → 返回 404

3️⃣ 原因总结

  • 服务器未对根路径 / 设置 SPA fallback

  • 仅对某个子路径配置了 try_files

  • 实际访问路径并未命中 fallback 规则

四、最终解决方案

👉 给根路径 / 增加统一的 SPA 回退规则。


五、正确的 Nginx 配置

XML 复制代码
server {
    #你的端口
    listen  port;
    #你的ip或域名
    server_name ip;

    # API 反向代理
    location ^~ /api/ {
        proxy_pass http://127.0.0.1:backend_port;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 前端 SPA
    root /path/to/your/frontend/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    # 禁止访问隐藏文件
    location ~ /\.(git|env|htaccess) {
        deny all;
    }
}

原配置:

调整后的配置:

六、配置说明

配置 作用
try_files $uri $uri/ /index.html 所有非静态文件请求回退给前端
root + index 指定前端构建输出目录
/api/ 代理

七、验证方式

1️⃣ 刷新 /finance-record → 不再 404

2️⃣ 访问 /assets/app.js → 正常返回

3️⃣ 调用 /api/calc → 正常代理

八、总结

Vue History 模式刷新 404 的根因不是 Vue,也不是浏览器,而是服务器不知道如何处理前端路由。

只要在 Nginx 层对根路径统一 fallback 到 index.html,问题即可彻底解决。

也可以这么说:

刷新 404 = 服务器找不到前端路由 → 用 try_files 回退给 index.html 即可

相关推荐
Forever7_6 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
不会敲代码16 小时前
前端组件化样式隔离实战:React CSS Modules、styled-components 与 Vue scoped 对比
css·vue.js·react.js
Angelial6 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
SuperEugene8 小时前
Vue状态管理扫盲篇:如何设计一个合理的全局状态树 | 用户、权限、字典、布局配置
前端·vue.js·面试
阿懂在掘金8 小时前
defineModel 是进步还是边界陷阱?双数据源组件的选择逻辑
vue.js·源码阅读
李剑一8 小时前
要闹哪样?又出现了一款新的格式化插件,尤雨溪力荐,速度提升了惊人的45倍!
前端·vue.js
阿虎儿9 小时前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
滕青山12 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力12 小时前
ts+vue3开发规范
vue.js·typescript
梦想CAD控件12 小时前
在线CAD开发包结构与功能说明
前端·javascript·vue.js