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 即可

相关推荐
HIT_Weston2 小时前
76、【Ubuntu】【Hugo】搭建私人博客:Hugo 版本更新
linux·运维·ubuntu
qq_353737542 小时前
服务器防止宕机
运维·服务器
Aotman_2 小时前
Vue.directive:自定义指令及传参
前端·javascript·vue.js·elementui·ecmascript·es6
梵得儿SHI2 小时前
2025 Vue 技术实战全景:从工程化到性能优化的 8 个落地突破
前端·javascript·vue.js·pinia2.2·响应式数据分片·展望vue3.6·2025年vue技术栈
LucianaiB2 小时前
【基于昇腾平台的CodeLlama实践:从环境搭建到高效开发】
运维·人工智能·性能优化
运维行者_2 小时前
网络流量分析入门:从流量监控与 netflow 看懂核心作用
运维·开发语言·网络·云原生·容器·kubernetes·php
wangyongpro2 小时前
Ubuntu 系统盘拓展分区空间大小
linux·运维·ubuntu
代码游侠2 小时前
应用——Linux FIFO(命名管道)与I/O多路复用
linux·运维·服务器·网络·笔记·学习
无奈笑天下2 小时前
麒麟V10SP1虚拟机安装vmtool-参考教程
linux·运维·服务器·个人开发