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白屏的资料请关注脚本之家其它相关文章!

相关文章

  • 如何使用 Vuex的入门教程

    如何使用 Vuex的入门教程

    在vue中当我们管理数据的时候比较乱,我们要用到下面的这个库,本文主要介绍了如何使用 Vuex的入门教程,具有一定的参考价值,感兴趣的可以了解一下
    2022-02-02
  • Vue+ElementUI怎么处理超大表单实例讲解

    Vue+ElementUI怎么处理超大表单实例讲解

    在本篇文章里小编给大家整理的是一篇关于Vue+ElementUI怎么处理超大表单实例讲解内容,以后需要的朋友可以跟着学习参考下。
    2021-11-11
  • Vue实现跑马灯样式文字横向滚动

    Vue实现跑马灯样式文字横向滚动

    这篇文章主要为大家详细介绍了Vue实现跑马灯样式文字横向滚动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 解决VantUI popup 弹窗不弹出或无蒙层的问题

    解决VantUI popup 弹窗不弹出或无蒙层的问题

    这篇文章主要介绍了解决VantUI popup 弹窗不弹出或无蒙层的问题。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue input输入框模糊查询的示例代码

    vue input输入框模糊查询的示例代码

    本篇文章主要介绍了vue input输入框模糊查询的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Vue监听一个数组id是否与另一个数组id相同的方法

    Vue监听一个数组id是否与另一个数组id相同的方法

    今天小编就为大家分享一篇Vue监听一个数组id是否与另一个数组id相同的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue如何下载本地pdf文件

    vue如何下载本地pdf文件

    这篇文章主要介绍了vue如何下载本地pdf文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 利用vue3编写一个有趣的牛马时钟并集成到小程序

    利用vue3编写一个有趣的牛马时钟并集成到小程序

    这篇文章主要为大家详细介绍了如何利用vue3编写一个有趣的牛马时钟并集成到小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-07-07
  • vue3 数组清空与重新赋值的操作代码

    vue3 数组清空与重新赋值的操作代码

    这篇文章主要介绍了vue3 数组清空与重新赋值的操作代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 一文带你掌握Vue中的路由守卫

    一文带你掌握Vue中的路由守卫

    路由守卫(Route Guards)是 Vue Router 的一个功能,它允许我们在路由发生之前执行逻辑判断,这篇文章主要为大家介绍了Vue中路由守卫的具体应用,需要的可以了解下
    2024-03-03

最新评论