Vue3+Vite+Nginx部署后刷新404白屏问题的完整排查指南

 更新时间:2026年03月04日 08:29:28   作者:一勺菠萝丶  
文章详细介绍了Vue单页应用(SPA)首次进入页面正常,一刷新就白屏或404的两种情况及其背后的原因,文章还提供了完整的修复步骤,包括修改Vite打包配置、检查Nginx配置、重新构建并部署等,需要的朋友可以参考下

症状:Vue 单页应用(SPA)首次进入页面正常,一刷新就白屏或 404。

一、问题现象

  • 访问 http://your-server/dashboard/home → 正常
  • 在该页面按 F5 / Ctrl+R 刷新 → 白屏,控制台报大量 404
  • 浏览器地址栏 URL 没变,但页面什么都加载不出来

二、问题本质:两个独立原因叠加

刷新白屏这个现象,背后其实有两个完全不同的原因,必须同时解决,缺一不可。

原因一:Nginx 不认识 Vue Router 的路由路径(基础原因)

Vue Router 使用 HTML5 History 模式createWebHistory)时,/dashboard/home 这类路径是纯前端路由,不对应任何真实文件

首次进入为什么正常?

用户从首页 / 进入应用,Nginx 找到真实的 index.html 并返回,Vue 的 JS 运行后,Vue Router 接管所有导航。用户点击菜单跳转到 /dashboard/home,这是 Vue Router 通过浏览器 History.pushState() 完成的,根本没有向服务器发送任何 HTTP 请求,所以正常。

刷新为什么失败?

刷新时浏览器向服务器发出真实的 HTTP 请求:GET /dashboard/home。Nginx 在硬盘上找不到对应的文件,于是返回 404

浏览器刷新  →  HTTP GET /dashboard/home  →  Nginx 找文件  →  找不到  →  404

Nginx 修复方式:配置 try_files,当找不到文件时,统一回退到 index.html,让 Vue Router 接管路由判断。

location / {
    root /home/your-app/dist;
    index index.html;
    try_files $uri $uri/ /index.html;   # 关键:找不到文件就返回 index.html
}

原因二:VITE_PUBLIC_PATH = ./导致资源路径错位(隐藏原因,也是本文重点)

仅修复 Nginx 之后,很多人发现:刷新后页面不再 404 了,但变成了白屏——HTML 返回了,JS/CSS 却全部 404。

这是因为 Vite 打包时,base 配置项(对应 VITE_PUBLIC_PATH)决定了 index.html 里所有静态资源的引用方式。

./(相对路径)vs/(绝对路径)的区别

VITE_PUBLIC_PATH = ./,打包产物 index.html 内容如下:

<script type="module" crossorigin src="./assets/index-BsHqOBiK.js"></script>
<link rel="stylesheet" href="./assets/index-Df9KKQPD.css" rel="external nofollow" >

./相对于当前页面 URL 的路径,浏览器会根据当前 URL 来解析:

当前 URL./assets/index.js 解析结果服务器实际文件结果
/(首页)/assets/index.js/dist/assets/index.js✅ 正常
/dashboard/home(刷新)/dashboard/assets/index.js不存在❌ 404

VITE_PUBLIC_PATH = /,打包产物 index.html 内容如下:

<script type="module" crossorigin src="/assets/index-BsHqOBiK.js"></script>
<link rel="stylesheet" href="/assets/index-Df9KKQPD.css" rel="external nofollow" >

/ 开头是绝对路径,浏览器无论在哪个 URL 下,都固定从网站根路径加载:

当前 URL/assets/index.js 解析结果服务器实际文件结果
/(首页)/assets/index.js/dist/assets/index.js✅ 正常
/dashboard/home(刷新)/assets/index.js/dist/assets/index.js✅ 正常

为什么首次进入正常,刷新才白屏?

因为"首次进入"通常是从网站根路径 / 加载的 index.html,此时 ./ 被正确解析为 /assets/...,资源加载成功,Vue 启动。

后续的页面跳转(/dashboard/home)是 Vue Router 纯前端路由,不触发新的 HTML 请求,资源早就加载完毕了,所以一切正常。

刷新时,浏览器重新请求 /dashboard/home 对应的 HTML,Nginx 回退返回 index.html,但浏览器此时 URL 是 /dashboard/home./assets/... 被解析为 /dashboard/assets/...,全部 404,白屏。

三、完整修复步骤

第一步:修改 Vite 打包配置

找到项目里的 .env.production(或 vite.config.ts 里的 base 字段):

# .env.production
- VITE_PUBLIC_PATH = ./
+ VITE_PUBLIC_PATH = /

或直接在 vite.config.ts 里:

export default defineConfig({
-  base: './',
+  base: '/',
})

第二步:检查 Nginx 配置

确保 Nginx 有正确的 try_files 兜底:

server {
    listen 80;
    server_name your-domain.com;

    root /home/your-app/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;   # 必须有这行
    }

    # 静态资源缓存(可选)
    location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?)$ {
        expires 30d;
        access_log off;
    }
}

注意 try_files 最后参数必须是 URI(如 /index.html),不能是文件系统绝对路径(如 /home/app/dist/index.html),否则 Nginx 会把它当 URL 再次查找,导致死循环或 404。

第三步:重新构建并部署

npm run build
# 将 dist/ 目录上传到服务器
nginx -s reload

第四步:验证构建产物

grep -o 'src="[^"]*"' dist/index.html | head -5

正确输出(绝对路径,/ 开头):

src="/assets/index-BsHqOBiK.js"

错误输出(相对路径,./ 开头):

src="./assets/index-BsHqOBiK.js"

四、常见错误配置(避坑)

错误一:try_files 用文件路径而非 URI

# ❌ 错误:/home/app/dist/index.html 被当作 URL 解析
try_files $uri $uri/ /home/app/dist/index.html;

# ✅ 正确:/index.html 是 URL 路径,Nginx 会用 root 拼接找到真实文件
try_files $uri $uri/ /index.html;

错误二:alias + try_files 兜底路径写错

location /app {
    alias /home/app/dist/;

    # ❌ 错误:兜底 URI 用 /index.html,
    # 这会跳回 location /,然后用 root 目录找文件,与 alias 目录不同
    try_files $uri $uri/ /index.html;

    # ✅ 正确:兜底 URI 带上 location 前缀,让请求再次进入这个 location
    try_files $uri $uri/ /app/index.html;
}

错误三:Hash 模式不需要任何 Nginx 配置

如果你使用的是 createWebHashHistory(URL 带 #,如 /#/dashboard/home),# 后面的内容不会发送给服务器,Nginx 永远只收到 GET /不存在刷新 404 问题,无需任何特殊配置。

只有 createWebHistory(无 # 的干净 URL)才需要上述配置。

五、总结

问题原因修复方式
刷新 404Nginx 不认识前端路由路径配置 try_files $uri $uri/ /index.html
刷新白屏(资源 404)VITE_PUBLIC_PATH = ./ 相对路径在非根 URL 下解析错误改为 VITE_PUBLIC_PATH = / 使用绝对路径

两个问题独立存在,必须同时解决。实际排查时,往往先修了 Nginx 发现还是白屏,再去查资源请求路径,才发现是打包配置的问题。

以上就是Vue3+Vite+Nginx部署后刷新404白屏问题的完整排查指南的详细内容,更多关于Vue3 Vite Nginx部署后刷新404白屏的资料请关注脚本之家其它相关文章!

相关文章

  • 在vue中读取本地Json文件的方法

    在vue中读取本地Json文件的方法

    今天小编就为大家分享一篇在vue中读取本地Json文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue中CSS scoped的原理详细讲解

    Vue中CSS scoped的原理详细讲解

    在组件中增加的css加了scoped属性之后,就在会在当前这个组件的节点上增加一个data-v-xxx属性,下面这篇文章主要给大家介绍了关于Vue中CSS scoped原理的相关资料,需要的朋友可以参考下
    2023-01-01
  • Vue结合ElementUI上传Base64编码后的图片实例

    Vue结合ElementUI上传Base64编码后的图片实例

    这篇文章主要介绍了Vue结合ElementUI上传Base64编码后的图片实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue配置文件实现代理v2版本的方法

    vue配置文件实现代理v2版本的方法

    这篇文章主要介绍了vue配置文件实现代理v2版本的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • vue前端el-input输入限制输入位数及输入规则

    vue前端el-input输入限制输入位数及输入规则

    这篇文章主要给大家介绍了关于vue前端el-input输入限制输入位数及输入规则的相关资料,文中通过代码介绍的介绍的非常详细,对大家学习或者使用vue具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • vue实现在进行增删改操作后刷新页面

    vue实现在进行增删改操作后刷新页面

    这篇文章主要介绍了vue实现在进行增删改操作后刷新页面,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue实现瀑布流组件滑动加载更多

    vue实现瀑布流组件滑动加载更多

    这篇文章主要为大家详细介绍了vue实现瀑布流组件滑动加载更多,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • vue实现计算器封装

    vue实现计算器封装

    这篇文章主要为大家详细介绍了vue实现计算器的封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 如何解决ElementUI导航栏重复点菜单报错问题

    如何解决ElementUI导航栏重复点菜单报错问题

    这篇文章主要介绍了如何解决ElementUI导航栏重复点菜单报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue根据进入的路由进行原路返回的方法

    vue根据进入的路由进行原路返回的方法

    今天小编就为大家分享一篇vue根据进入的路由进行原路返回的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09

最新评论