Nginx配置Vue项目Hash/History模式路由跳转错误的解决方案

 更新时间:2025年09月17日 08:55:16   作者:网罗开发  
这篇文章主要为大家详细介绍了Nginx配置Vue项目Hash/History模式路由跳转错误的相关解决方案,文中的示例代码讲解详细,需要的小伙伴可以了解下

前言

最近在一个实际项目中,前端采用 Vue2,路由模式是 hash,后台通过 Nginx 部署。我们遇到一个让人头疼的问题:访问子路径路由 /inv/#/login 时,竟然跳转到了错误的页面。切换成 history 模式后路由倒是正常了,但一刷新页面,前端资源就加载失败,提示 MIME 类型错误。

这篇文章我会把问题的原因分析清楚,然后结合 Nginx 配置与 Vue 路由的特性给出可运行的解决方案,顺便给出实际案例中的 Demo 配置,方便你参考。

背景:Nginx 配置 + Vue 路由模式

在我们的项目中,存在两个前端子系统:

  • 管理端:路径 / → 对应目录 /data/web/sccmp/
  • 组长端:路径 /inv/ → 对应目录 /data/web/inv/

Nginx 配置如下:

location / {
    alias /data/web/sccmp/;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
}

location /inv/ {
    alias /data/web/inv/;
    index index.html index.htm;
    try_files $uri $uri/ /inv/index.html;
}

Vue 项目中,路由配置采用的是 hash 模式:

const router = new VueRouter({
  mode: 'hash',
  routes: [
    { path: '/login', component: Login },
    { path: '/dashboard', component: Dashboard }
  ]
})

遇到的问题

1.在 hash 模式下访问组长端 https://xxxx.xx.cppinfo.cn/inv/#/login

页面居然跳转到管理端的登录页,而不是组长端。

2.在 history 模式下刷新页面

出现错误:

Failed to load module script: Expected a JavaScript-or-Wasm module script 
but the server responded with a MIME type of "text/html".

简单说就是 JS 资源请求到了 HTML 文件,Nginx 没有正确返回对应的静态资源。

问题出在哪里

这个问题本质上分两层:

1.Hash 模式下路径混淆

Hash 模式的 URL 是 https://domain/inv/#/login,实际上 Nginx 并不知道 #/login 部分,它只处理 /inv/,而 Vue 的 JS 脚本却从 / 路径下去加载资源,导致加载的是管理端的 index.html。

2.History 模式下资源路径错误

在 history 模式下,Vue 的 URL 例如 /inv/login,Nginx 需要把所有未知路径回退到 /inv/index.html。如果配置不对,就会把资源请求(比如 /inv/js/app.js)错误地 fallback 到 HTML,从而导致 MIME type 错误。

如何解决

方案一:继续使用 Hash 模式(推荐初学者)

如果项目允许继续用 hash 模式,需要确保 每个子系统的资源路径是独立的,避免加载错目录。

在 Vue 的 vue.config.js 中设置 publicPath

// vue.config.js
module.exports = {
  publicPath: '/inv/',  // 对应组长端的部署路径
  outputDir: 'dist',
  productionSourceMap: false
}

这样构建出来的资源都会挂在 /inv/ 下,避免冲突。

Nginx 保持原配置即可。

方案二:使用 History 模式(推荐最终方案)

History 模式对 URL 更友好,但需要 Nginx 配置精确区分资源和路由。

Nginx 修改如下:

location / {
    root /data/web/sccmp;
    index index.html;
    try_files $uri $uri/ /index.html;
}

location /inv/ {
    root /data/web/inv;
    index index.html;
    # 只针对 html 路由回退
    try_files $uri $uri/ /index.html;
}

关键点:

  • root 用而不是 alias(如果用 alias,要小心路径拼接规则)。
  • try_files/index.html 会 fallback 到当前 root 的 index.html,而不会错误地去加载 / 下的文件。
  • 保证静态资源路径正确,例如 /inv/js/app.js 请求到 /data/web/inv/js/app.js

实战 Demo 配置(可运行)

假设我们有两个 Vue 项目,构建产物分别在 /data/web/sccmp//data/web/inv/

Vue 配置 vue.config.js

// 管理端 vue.config.js
module.exports = {
  publicPath: '/',
  outputDir: 'dist-admin',
}

// 组长端 vue.config.js
module.exports = {
  publicPath: '/inv/',
  outputDir: 'dist-inv',
}

Nginx 配置:

server {
    listen 80;
    server_name demo.local;

    location / {
        root /data/web/sccmp;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /inv/ {
        root /data/web/inv;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

这样:

  • 访问 http://demo.local/ → 管理端
  • 访问 http://demo.local/inv/ → 组长端
  • 刷新任意路由(无论是 /dashboard 还是 /inv/login)都能正常返回对应的 index.html,再由前端接管路由。

总结

  • Hash 模式:简单,兼容性强,但 URL 不够美观。需要在 Vue 构建配置里设置好 publicPath,避免资源路径错乱。
  • History 模式:更优雅,但 Nginx 必须配合 try_files 做路由回退,确保静态资源不会被错误地 fallback 到 index.html。
  • 问题本质:不是 Vue 路由写错,而是 Nginx 路径处理和前端 publicPath 没有对应上。

我的建议是:开发初期可以用 Hash 模式省心,上线前建议切换到 History 模式,并仔细配置好 Nginx。

到此这篇关于Nginx配置Vue项目Hash/History模式路由跳转错误的解决方案的文章就介绍到这了,更多相关Nginx配置Vue路由模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx+Lua+Redis构建高并发Web应用

    Nginx+Lua+Redis构建高并发Web应用

    使用Nginx+Lua+Redis来构建高并发Web应用,Curl请求Nginx,Nginx通过Lua查询Redis,返回json数据。
    2013-10-10
  • 加速nginx性能: 开启gzip和缓存

    加速nginx性能: 开启gzip和缓存

    nginx 是一个高性能的 Web 服务器,之前也写过一些关于 nginx 的文章。为了提高博客的响应速度,可以从设置 nginx 的 gzip 和缓存这2方面入手。为字体开启 gzip 和缓存能大大减少带宽的消耗
    2017-03-03
  • nginx 部署启动jar包用到的一些命令和流程操作

    nginx 部署启动jar包用到的一些命令和流程操作

    这篇文章主要介绍了nginx 部署启动jar包用到的一些命令和流程操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 使用Nginx解决跨域问题的步骤详解

    使用Nginx解决跨域问题的步骤详解

    这篇文章主要给大家介绍了使用Nginx解决跨域问题的方法,文中有详细的流程步骤,通过图片介绍的非常详细,对我们的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • Nginx 配置过程的具体步骤

    Nginx 配置过程的具体步骤

    这篇文章主要介绍了Nginx 配置过程的详细介绍的相关资料,希望通过本文能帮助到大家,让大家掌握如何配置Nginx,需要的朋友可以参考下
    2017-10-10
  • nginx反向代理导致session失效的问题解决

    nginx反向代理导致session失效的问题解决

    这篇文章主要介绍了nginx反向代理导致session失效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Nginx出现403 Forbidden问题的常见原因与解决

    Nginx出现403 Forbidden问题的常见原因与解决

    Nginx 返回 403 Forbidden 错误通常表示客户端没有权限访问请求的资源,这种错误有许多可能的原因,本文将为大家介绍一下常见的原因和对应的解决方法,希望对大家有所帮助
    2025-03-03
  • Nginx工作模式及代理配置的使用细节

    Nginx工作模式及代理配置的使用细节

    这篇文章主要为大家介绍了Nginx工作模式及代理配置的使用细节,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Nginx图片防盗链配置实例

    Nginx图片防盗链配置实例

    这篇文章主要介绍了Nginx图片防盗链配置实例,并对代码做了详细的说明,让你充分理解配置的意图,需要的朋友可以参考下
    2014-07-07
  • nginx结合openssl实现https的方法

    nginx结合openssl实现https的方法

    这篇文章主要介绍了基于nginx结合openssl实现https的方法,准备工作大家需要安装nginx服务,具体操作过程跟随小编一起看看吧
    2021-07-07

最新评论