Vue与Nginx路由静态文件冲突的问题

2020-06-17  本文已影响0人  7ColorLotus
  1. Vue有自己的路由,Nginx 也有自己的路由,当冲突的时候,即客户端访问Nginx配置的路由出问题的时候可以使用Nginx的rewrite方法,当无法找到资源目录的时候跳转到Vue路由的固定页面(一般是index),配置如下:
## 示例路径:  https://www.7colorlotus.net/manage/index

location ^~ /manage {
  alias   /data/www/manage;
  if (!-e $request_filename) { # 当找不到资源时
       rewrite ^/(.*)/(.*)  /$1/index.html last;
       break;
  }
}
  1. 上面的示例代码,可以解决一般vue路由问题,但是如果一个vue项目,既有一级路由目录,也有二级路由目录时,上面的配置方案会导致在访问二级目录时出问题,这个问题,就是rewrite后面的正则表达式问题,他们不能既匹配一级路由目录也不能匹配路由目录,可以采用如下方式匹配:
## 示例路径:  https://www.7colorlotus.net/manage/label/order_list

location ^~ /manage {
    alias   /data/www/manage;
    if (!-e $request_filename) { # 当找不到资源时
         rewrite ^/(.*)/(.*)  /$1/index.html;  # 匹配vue一级路由目录,注意后面没有last,下面没有break
    }
    if (!-e $request_filename) { # 当找不到资源时
         rewrite ^/(.*)/(.*)/(.*)  /$1/index.html last; # 匹配vue二级路由目录,如果不需要匹配三级目录这里可以加上last
         break;
    }
}
  1. 贴上Vue路由相关的代码
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },
]

const createRouter = () => new Router({
  mode: 'history', // require service support
  base: process.env.BASE_URL,
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRoutes
})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

export default router
  1. 使用上面的方法,即可解决Vue与Nginx路由静态文件冲突的问题了。关于Nginx配置的问题,可以查看这里Nginx进阶
上一篇下一篇

猜你喜欢

热点阅读