nginx部署使用history模式的vue项目详细配置【可多级目录】
介绍
本文是篇详细的介绍vue项目在history模式下发布时build,项目如何配置,nginx如何配置,才能正常的使用历史模式。或者在二级目录下,多级路径下也能正常使用历史模式。
本文的例子中假设,nginx全部都是配置在 flytree.can 域名下。
且路由中配置有以下路径:
const routes = [
{ path: '/', redirect: "/index"},
{ path: '/login', component: Login },
{ path: '/welcome', component: Welcome }
]
一级路径的配置
应用放在服务器根目录下。路由也就是域名后的第一级路径。如:
| url | 对应打开路由 |
|---|---|
| http://www.flytree.can/login | /login |
| http://www.flytree.can/welcom | /welcom |
路由配置
const router = new VueRouter({
mode: 'history',
routes
})
nginx配置
location / {
try_files $uri $uri/ /index.html;
}
二级路径的配置
应用不是放在服务器根目录下,而是location有上下文的。如配置了web上下文,则:
| url | 对应打开路由 |
|---|---|
| http://www.flytree.can/web/login | /login |
| http://www.flytree.can/web/welcom | /welcom |
路由配置
如果在ngnix代理的时候不是配置到根路径/的话,则要配置base,它指定的是应用的基路径。例如,如果整个单页应用服务在 /app/ 下,然后 base 就应该设为 "/app/"。
router/index.js配置:
const vueRouter = new Router({
mode: "history",
base: "/web",
routes: routes
})
配置了base后,应用就会在base之后打开了,如,后面配置了个/login路由,则是在/web/login中打开此路由。
项目config配置
注:由于项目里使用的是老版本的vue-cli,新版本@vue/cli配置会在旁说明。
老版本的配置文件在config/index.js中,如果是cli 3.x后续版本,需在项目 (和 package.json 同级的) 根目录中创建vue.config.js文件进行配置。
const path = require('path');
module.exports = {
module.exports = {
build: {
// 指定生成的 index.html 的输出路径 (相对于 配置文件所在路径)。也可以是一个绝对路径。
// 新版本使用:indexPath
index: path.resolve(__dirname, '../web/index.html'),
// 指定生成的 资源 的输出的目录 (相对于 配置文件所在路径)。此,build后到dist目录下。注意目标目录在构建之前会被清除。
// 新版本使用:outputDir
assetsRoot: path.resolve(__dirname, '../web'),
// 指定除了index.html外的静态资源的目录
// 新版本使用:assetsDir
assetsSubDirectory: 'public',
// 部署应用包时的基本 URL。指定打包后,index.html里面引用资源的的相对地址。
// 这个值也可以被设置为空字符串 ('') 或是相对路径 ('./'),这样所有的资源都会被链接为相对路径
// 如我在index.html中应用了张在pulblic下的图片flytree.jpg
// 则引用是 src='./public/flytree.jpg'
// 新版本:publicPath
assetsPublicPath: '/web/',
}
}
}
配置以后bulid后,部署的文件会在项目下web文件下。
外部文件应用配置
如配置了assetsPublicPath路径,如这里配置的是./相对路径,则在发布的时候要将引用的静态资源设置在,其路径里,如:
<img src="./public/img/flytree.png">
<script>
axios.get('./public/JSON/data.json')
</script>
为了方便开发和发布时使用静态资源,可以:
// main.js中配置
window.base_file_url =
process.env.NODE_ENV === 'production' ? '.' : ''
// 使用
axios.get(base_file_url + '/public/JSON/data.json')
nginx的配置
location /web {
alias F:/Program_D/work/demo/web/;
try_files $uri $uri/ /web/index.html;
}
如此,项目就部署在http://www.flytree.cam/web下了。
多级路径的配置
可能会有人说,谁TM竟然要这么麻烦,搞这么多级路径干啥。但事实就是还真能遇到就要配这么多级的路径。要不然就不会有本文了。
router配置
注:这里base可以配置多级路径,比如:
const vueRouter = new Router({
mode: "history",
base: "/app/web",
routes
})
那么,当前应用将部署在/app/web下:
| url | 对应打开路由 |
|---|---|
| http://www.flytree.can/app/web/login | /login |
| http://www.flytree.can/app/web/welcom | /welcom |
| 若要配置多级路径,其它的配置也要作修改, |
项目config配置
配置后,build后会生成一个有层级的文件夹。
const path = require('path');
module.exports = {
module.exports = {
build: {
// 指定生成的 index.html 的输出路径 (相对于 配置文件所在路径)。也可以是一个绝对路径。
// 新版本使用:indexPath
index: path.resolve(__dirname, '../app/web/index.html'),
// 指定生成的 资源 的输出的目录 (相对于 配置文件所在路径)。此,build后到dist目录下。注意目标目录在构建之前会被清除。
// 新版本使用:outputDir
assetsRoot: path.resolve(__dirname, '../app/web'),
// 指定除了index.html外的静态资源的目录
// 新版本使用:assetsDir
assetsSubDirectory: 'public',
// 部署应用包时的基本 URL。指定打包后,index.html里面引用资源的的相对地址。
// 这个值也可以被设置为空字符串 ('') 或是相对路径 ('./'),这样所有的资源都会被链接为相对路径
// 如我在index.html中应用了张在pulblic下的图片flytree.jpg
// 则引用是 src='./public/flytree.jpg'
// 新版本:publicPath
assetsPublicPath: '/app/web/',
}
}
}
nginx配置
location /app/web/ {
# alias F:/Program_D/work/demo/app/web/;
root F:/Program_D/work/demo/;
try_files $uri $uri/ /app/web/index.html;
}
原理分析
就拿这个多级的举例吧。
| url | 对应打开路由 |
|---|---|
| http://www.flytree.can/app/web/login | /login |
| http://www.flytree.can/app/web/welcom | /welcom |
当访问 http://www.flytree.can/app/web/login 时,
- nginx 配置了上下文
/app/web/。所以$uri的值是/login。 - try_files 会将此路径,响应为
root+/app/web/index.html。 - 浏览器打开了
index.html也就是history模式的vue项目,此时vue-router匹配路由/login,将此路由内容插入到index.html中。
补充说明
nginx配置的一些说明
- 关于 try_files
try_files $uri $uri/ /index.html;
这个命令可以将其后的参数,响应到最后一个参数的路径中去。在这里通俗来说,就是匹配到啥$uri我都给你响应index.html。前提是有index.html,否则会响应到别的location配置中去(有的话),或404。
- root 和 alias 的区别
首先这两玩意都是指定服务器的响应文件路径的。
- 使用
root配置时,则配置到 项目路径的上层路径。此时,nginx会去读取的文件路径是,root + location的上下文(其后面跟着的)拼成的路径。 alias就配置到项目的完整的路径,配置到index这一级。nginx会去读取的文件路径时就会按照alias指定的路径读取。
参考内容
- 关于
try_files $uri $uri/ /index.html的说明:
Niginx中Vue Router 历史(history)模式的配置 - vue-router history模式在nginx二级目录下的配置
nginx部署使用history模式的vue项目详细配置【可多级目录】的更多相关文章
- Jenkins+SpringCloud(多模块)+Vue项目详细配置
一.Jenkins安装及所需插件安装 安装过程略. 我这用到工具包括JDK.Git.Maven.NodeJS:可以选择自行在服务器安装,也可以通过Jenkins自动安装,位置在系统管理 >全局工 ...
- [转]Vue项目全局配置微信分享思路详解
这篇文章给大家介绍了vue项目全局配置微信分享思路讲解,使用vue作为框架,使用vux作为ui组件库,具体内容详情大家跟随脚本之家小编一起学习吧 这个项目为移动端项目,主要用于接入公众号服务.项目采用 ...
- 如何为你的 Vue 项目添加配置 Stylelint
如何为你的 Vue 项目添加配置 Stylelint 现在已经是 9102 年了,网上许多教程和分享帖都已经过期,照着他们的步骤来会踩一些坑,如 stylelint-processor-html 已经 ...
- linux vue uwsgi nginx 部署路飞学城 安装 vue
vue+uwsgi+nginx部署路飞学城 有一天,老男孩的苑日天给我发来了两个神秘代码,听说是和mjj的结晶 超哥将这两个代码,放到了一个网站上,大家可以自行下载 路飞学城django代码#这个代码 ...
- `vue-router`的`History`模式下的项目发布
背景 脚手架版本号:vue cli 3.x 项目路由:vue-router的History模式 原理:url路由处理逻辑从后端转移到前端. 参考:https://developer.mozilla.o ...
- 利用vue-cli3快速搭建vue项目详细过程
一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue ...
- vue-cli安装以及搭建vue项目详细步骤
vue init webpack projectname(projectname是你项目的名称) 创建项目卡住不动解决方案: https://cli.vuejs.org/zh/guide/instal ...
- vue项目如何配置路由
vue3项目中如何配置路由 1.下载vue-router,在路由文件中引入相关依赖 import {createRouter,createWebHashHistory} from 'vue-route ...
- vue项目搭建及创建、目录结构、项目启动、全局配置
Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...
- vue项目中配置scss
之前创建 vue 项目的时候没有选择 scss 预编译,现在项目中要使用,不知道如何配置,网上搜了下全都是: npm install sass-loader --save-devnpm instal ...
随机推荐
- Linux下配置node环境与failed to create symbolic link ‘/usr/bin/utserver’: File exists跟Error: Cannot find module '/root/node-v10.16.3-linux-x64/install'解决方法
NodeJS下载地址(官网) https://nodejs.org/en/download/ 下载下来后是个tar,xz压缩包 通过xftp将压缩包上传到Linux服务器上 如我放在root目录下 使 ...
- verilog之原语设计
verilog之原语设计 1.原语作用 在一般的verilog设计中,一般采用数字逻辑设计,由软件将数字逻辑转化为特定的数字电路.但是,对于某些特殊的领域,有可能需要用户直接自定义数字电路以达到对指定 ...
- java使用ftp连接linux处理文件
1.Maven依赖 <!-- FTP使用包 --> <dependency> <groupId>commons-net</groupId> <ar ...
- kingbase ES 关于NULL及其相关函数
文章概要: 本文对主要就NULL值及其相关处理函数进行讨论,同时也介绍了ora_input_emptystr_isnull参数 一,关于NULL值 1,sql中的null值 null 值代表未知数据, ...
- KingbaseES sys_restore 恢复表时默认不包括表上的索引
前言 最近碰到一个案例,在使用sys_restore恢复指定表时,默认不恢复表上的索引,如果想恢复需要单独指定. 测试过程 [](javascript:void(0) 查看表的有关属性:test=# ...
- C++ future
promise 空模板 非 void 特化,用于在线程间交流对象 void 特化,用于交流无状态事件 类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象 ...
- #差分约束系统#CodeChef Digit Matrix&洛谷 7515 [省选联考 2021 A 卷] 矩阵游戏
洛谷传送门 DGMATRIX 分析 先任意构造出一个不一定满足值域的矩阵,现在只需要满足值域就可以了. 可以发现,给一行或一列依次加一减一2*2矩阵的和仍然不变,并且如果有解一定能构造出一组方案. 因 ...
- #线性基,差分,线段树#洛谷 5607 [Ynoi2013] 无力回天 NOI2017
题目 分析 考虑区间修改比较难操作,将数组差分一下,转化成两次单点修改. 这样查询前缀的异或值就是该位置的异或值,线性基可以用线段树维护, 那么取出 \((l,r]\) 所在的线性基,再将 \(a[l ...
- 【LGR-065】洛谷11月月赛 III Div.1
T1,T2,T3,T4 T1 基础博弈练习题 分析 首先区间长度为1的情况特判,偶数必胜,奇数必败 考虑倒推,如果最后一个位置为偶数那么该位置为必败局面,否则为必胜局面 因为先手到这个位置要减去1就会 ...
- 浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400
一.前言 OpenAtom OpenHarmony(以下简称"OpenHarmony")采用多内核架构,支持Linux内核的标准系统.LiteOS-A的小型系统.LiteOS-M的 ...