旧文从语雀迁移过来,原日期:2021-09-13

前言

我们知道,vue 单页面应用打包出来是静态资源,一般需要 nginx 或者其他服务器访问;当如果 Vue Router 是采用 History 模式时,又会有额外的配置。这里记录一下完整配置过程中的每一个细节。

静态资源

我们首先要配置好如何访问我们打包出来的静态资源。

基本配置

当 URL 无需前缀时,基础的配置是这样的:

server {
listen 80;
server_name testhistory.com; location / {
root /Users/admin/www/h5;
index index.html;
}
}
  • root:静态资源的位置
  • index: 可以通过index来访问index.html,而index一般是可以省略的

然后配置上 Host:

127.0.0.1 testhistory.com

就可以通过 http://testhistory.com 就可以访问到页面了。

带前缀的访问路径

有时候,同一域名下有可能多个不同的前端服务,这时候我们会通过前缀告诉 nginx 加载或者反向代理到对应的资源(比如说我司的不同城市业务对应的前端项目就不一样)。

带前缀的静态资源配置:

    location /h5 {
root /Users/admin/www;
index index.html;
}

不一样的地方是,当有前缀时,实际的访问路径会变成 root 路径加上前缀。所以这里,root 会去掉 /h5 。

如果不想加上前缀的话,那可以使用 alias 指令 :

    location /h5 {
alias /Users/admin/www/h5;
index index.html;
}

通过 http://testhistory.com/h5 访问时,可以看到index.html是访问对的。

但是js和css访问有问题的,那是因为静态资源实际是在h5目录下的,而在打包出来的index.html中引用的资源没有带上h5前缀。



很简单,只需在 vue.config.js 中配置上公共资源目录:

module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/h5/'
: '/',
outputDir: 'h5', // 加上这个配置,让打包出来的目录由默认的dist改为h5,方便写部署脚本
...
}

除了 js、css 公共资源目录,还有路由配置也要增加基本前缀,为了保证前端路由和服务器的一致:

const router = new VueRouter({
base: 'h5',
routes
})

这时候再去访问http://testhistory.com/h5就无问题了。

使用root还是alias

刚才提到这两个指令都可以,那什么时候使用呢?

  • 当无前缀时,使用root和alias一样,一般使用root;
  • 当有前缀时,如果前缀名和目录路径最后一段路径一致,那应该使用root,而不一致的话,应该使用alias.。

History模式

要开启 History 模式,vue router 的配置很简单,只要加上下面一句话:

mode: 'history',

开发时访问是正常的,但当打包部署后,会发现当:

try_files

为什么会出现这种情况呢?因为刷新时时通过 nginx 去访问静态资源的,明显这个路径是找不到,因为这个只是前端路由。为了解决这个问题,我们需要当访问的是前端路由时,去访问 index.html 这个主入口,再由前端路由自己来访问到对应的页面。而 nginx 就会用到 try_files 这个指令。

先来看看加上 try_files 后的配置:

location /h5 {
root /Users/admin/www;
index index.html;
try_files $uri $uri/ /h5/index.html;
}

配上后,就能正常访问 http://testhistory.com/h5/about 了。

我们看看 try_files $uri $uri/ /h5/index.html 做了什么,找到官网的语法:

try_files file... uri

这个语法的意思是:

  • try_files后面可以定义多个文件路径和最后一个作为内部跳转的uri,其中文件路径是和 **alias** 和 **root** 两个指令合在一起构造而成
  • 多个文件以第一个找到的文件作为请求;
  • 而文件后面以"/"结尾,会检查目录是否存在;
  • 当文件都找不到时,就会去以最后一个uri进行内部跳转请求

以我们例子为例:

  • 我定义了 try_files $uri $uri/ /h5/index.html ,root是 /Users/admin/www ;
  • 定义了两个文件,$uri和$uri,我的访问路径时http://testhistory.com/h5/about, $uri 是 /h5/about ,那么加上root作为根目录不能找到 , $url/ 也不能找到对应的目录;
  • 文件找不到了,那么就内部跳转到 /h5/index.html ,就相当于内部去请求http://testhistory.com/h5/index.html对应的文件资源,那前端接收文件资源后,就会根据路由自行跳转到对应的页面了。

总结

  • 通过配置History模式,我学到了:**root和alisa的区别、index指令、try_files指令和
  • nginx 指令是很多的,需要理解的话,需要去官网逐一查询并组合尝试,通过实际使用场景去学习,会理解得更透彻。

参考

History模式的配置细节的更多相关文章

  1. vue 中 history 模式的配置和打包

    在使用 vue 进行项目开发中,默认的路由形式是 hash,表现形式就是 url 中始终带有 # 号,在后台管理类的项目中并不影响使用,但是在特殊场景,比如微信分享的H5链接中,微信会自动拼接参数,由 ...

  2. vue路由history模式,nginx配置

    nginx配置内容 # For more information on configuration, see: # * Official English Documentation: http://n ...

  3. vue-router的history模式发布配置

    如果你正在尝试将基于vue-router的项目部署到windows中,希望本文能够有所帮助. iis配置 无需安装其他组件,将错误页指向index.html即可 <?xml version=&q ...

  4. vue-router history 模式 iis 配置

    首先需要安装 url rewrite模块到IIS点我安装 然后在web.config文件中添加如下配置 <?xml version="1.0" encoding=" ...

  5. vue history模式 apache配置

    我的服务器apache 版本是2.4.6 看文档上面说加那些代码,但是加上去重启服务器就不能重启,显示代码错误,然后百度查开启mod_rewrite这个重写URL 弄了半天也不会,百度上面的不知道是不 ...

  6. vue路由的两种模式配置以及history模式下面后端如何配置

    vue路由的两种模式配置以及history模式下面后端如何配置 1.hash ——即地址栏URL中的#符号.hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变has ...

  7. nginx 配置支持URL HTML5 History 模式 与 设置代理

    拾人牙慧:https://segmentfault.com/q/1010000007140360 nginx 配置支持URL HTML5 History 模式 location / { try_fil ...

  8. Vue路由history模式踩坑记录:nginx配置解决404问题

    问题背景: vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想hash这种以#号结尾的路径时候的话,我们可以使 ...

  9. vue history 模式打包部署在域名的二级目录的配置指南

    最近在做项目,需要把项目部署在域名下的二级目录,并且是在用vue-router的history 模式. 我们都知道vue-router 的两种前端基本访问模式 hash 和history .hash ...

随机推荐

  1. Petrozavodsk Winter Training Camp 2016: Moscow SU Trinity Contest

    题目列表 A.ABBA E.Elvis Presley G. Biological Software Utilities J. Burnished Security Updates A.ABBA 题意 ...

  2. .NET MAUI 社区工具包 1.3版本发布

    2022 年 10 月 4 日,微软发布了 .NET MAUI 社区工具包的 1.3 版,具体参见微软官方博客:https://devblogs.microsoft.com/dotnet/announ ...

  3. 利用FastReport传递图片参数,在报表上展示签名信息

    在一个项目中,客户要求对报表中的签名进行仿手写的签名处理,因此我们原先只是显示相关人员的姓名的地方,需要采用手写方式签名,我们的报表是利用FastReport处理的,在利用楷体处理的时候,开发展示倒是 ...

  4. Codeforces Round #804 (Div. 2) C(组合 + mex)

    Codeforces Round #804 (Div. 2) C(组合 + mex) 本萌新的第一篇题解qwq 题目链接: 传送门QAQ 题意: 给定一个\(\left [0,n-1 \right ] ...

  5. 如何使用IDEA创建一个简单的java工程?

    文章目录 1.创建新工程 1.1 新建项目 1.2 在src目录下创建package 1.3 在包下创建类 2.编写代码.运行项目 2.1 编写代码 2.2 运行结果 3.开心的从eclipse转移到 ...

  6. 再有人说synchronized是重量级锁,就把这篇文章扔给他看

    synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用. 但不可否认的是synchr ...

  7. 两个行内元素在一起,会出现一定的间距,即使将border、padding、margin都设置为零也无济于事,那么怎么才能去除这些间距呢?

    首先这里的div设置为了行内块元素,span本身为行内元素,并且设置了* {padding: 0; margin: 0;},那怎么清除元素之间的空白缝隙呢?? (1)给元素加浮动 <!DOCTY ...

  8. Mysql综合实验2-LAMP+MHA+MYcat分库

    实验目标: 1.搭建主从半同步+GTID复制 2.搭建MHA主服务器高可用 3.Mycat实现分库:wordpress库和shopxo库 4.客户通过域名可以访问到wordpress和shopxo 实 ...

  9. java反序列化漏洞cc_link_one

    CC-LINK-one 前言 这里也正式进入的java的反序列化漏洞了,简单介绍一下CC是什么借用一些官方的解释:Apache Commons是Apache软件基金会的项目,曾经隶属于Jakarta项 ...

  10. kafka-consumer-groups 命令行工具使用手册

    kafka-consumer-groups 命令行工具使用手册 该手册原文出自 $KAFKA_HOME\bin\windows\kafka-consumer-groups.bat --help 命令的 ...