路由模式

众所周知,浏览器下的单页面应用的路由模式有下面两种: hash 模式和 history 模式。hash 模式通用性好,而且不依赖服务器的配置,省心省力,但是缺点是不够优雅。相比于 hash 模式来说,history 模式则更加美观。

但是,history 模式同样会有一个问题,就是当页面刷新时,如果没有合适的配置,会出现页面 404 的错误。因此需要额外的服务器配置,对于找不到的 url,将首页 html 返回。

接下来,咱们以 nginx 为例,来说说 history 模式时需要进行的配置。

location

location 位于 http->server 块中,语法格式如下:

Syntax: location [= | ~ | ~* | ^~] uri { ... }

location @name { ... }

Default: —

Context: server, location

[= | ~ | ~* | ^~],是修饰符,可以控制 nginx 匹配的顺序。优先级关于四个修饰符的含义,可以参考 这篇文章。这里不过多叙述,总之当一个 server 下面有多个 location 时,nginx 会根据 uri 的精确度和修饰符进行匹配。查找的顺序及优先级如下:

查找顺序和优先级

1:带有“=“的精确匹配优先

2:没有修饰符的, 谁更精确谁优先,如 / 和 /post , 则 post 优先

3:正则表达式按照他们在配置文件中定义的顺序

4:带有 “^~” 修饰符的,开头匹配

5:带有“~” 或“~*” 修饰符的,如果正则表达式与 URI 匹配

6:没有修饰符的,如果指定字符串与 URI 开头匹配

try_files

try_files 解决的是:当 nginx 找不到客户端需要的资源时该怎么办的问题。以 history 路由为例:假如你的页面 url 是 http://www.example.com/post,你的 nginx 配置如下:

location  / {
root local/web/dist
}

当你在 post 路由下刷新页面时,nginx 会返回 404。这是什么原因呢?因为我们没有告诉nginx找不到某个文件时该怎么做。root 指定了 / 对应的单页静态资源目录,从而使url映射到dist目录下。

这个配置可以让你项目的 css,js 被顺利加载,但是碰到上面的 URL,nginx 就不知所措了。因为我们的 dist 文件夹下面并没有 post 这个文件或者文件夹,所以 nginx 会给你个 404 页面。try_files 就是为了解决这个问题的,try_files 语法如下:

location / {
try_files $uri $uri/ /index.html;
}

以上面的 http://www.example.com/post 为例,$uri 会匹配到 post,nginx 发现 dist 目录下下面没有 post 这个文件,也没有 post 这个文件夹,所以最后会返回 dist 目录下的 index.html。这样,index.html 被浏览器加载之后,前端路由就会工作,将用户需要的资源加载出来。而我们 build 出来的 css,js 文件,由于可以被 nginx 正确找到,则不会受到影响。

alias

当URL的子路径和文件夹路径不一致时,可以使用alias,参考nginx alias

参考链接

history路由模式下的nginx配置的更多相关文章

  1. 单页面应用的History路由模式express后端中间件配合

    这篇文章主要分享一下通过HTML5的history API的时候,使用NodeJS后端应该如何配置,来避免产生404的问题,这里是使用的express的框架,主要是通过connect-history- ...

  2. vue-cli3.x正确打包项目,解决静态资源与路由加载无效的问题,history模式下配合使用nginx运行打包后的项目

    使用vue-cli3.x正确打包项目,配合nginx运行打包后的内容 vue.config.js module.exports = { publicPath: './',//打包后的位置(如果不设置这 ...

  3. vue-router History 本地开发环境和nginx配置

    vue-router mode=history本地开发环境配置 解决方法1.修改webpack的的devServer配置项(devServe存在于,rvue-cli2在webapck.config.j ...

  4. windows下用nginx配置https服务器

    1.安装nginx 先到nginx官网下在nginx http://nginx.org/en/download.html 将下载好的文件解压出来修改文件名为 nginx ,然后拷贝到C盘下,目录如下: ...

  5. RedHat 6.6下安装nginx,配置HTTPS

    1.安装依赖包 yum -y install pcre-devel openssl-devel zlib-devel 2.下载nginx安装包到服务器上,当前使用版本nginx-1.15.5.tar. ...

  6. Window下将nginx配置为开机自动启动

    前两天看到公司window服务器上面有个nginx在跑,重启服务器后没有自动启动,需要手动运行nginx,甚是麻烦呀 上网找了一下关于将nginx配置为系统服务并且开机自动启动的解决方案,这里mark ...

  7. nginx history路由模式时,页面返回404重定向index.html

    1.路由默认是带#的,有时我们感觉不美观,就使其变为history模式,也就没有#字符 2.# 如果找不到当前页面(404),就返回index.html,重新分配路由 location ^~/prod ...

  8. nginx 一个端口布署多个单页应用(history路由模式)。

    目前web开发 使用一般前后端分离技术,并且前端负责路由.为了美观,会采用前端会采用h5 history 模式的路由.但刷新页面时,前端真的会按照假路由去后端寻找文件.此时,后端必须返回index(i ...

  9. Vue history路由模式 apache配置上线

    1. 首先在vue项下的router.js 文件配置 mode为history模式,并且设置好对应的base选项 说明:base配置为你当前项目实际上线时所在的目录文件夹, 我这就是放在站点的根目录下 ...

随机推荐

  1. excel转pdf,itextpdf转换excel

    最近项目有需求,需要把excel转pdf.由于时间比较急,所以在github上找了一个转换的.最终没用上,但还是踩坑了一波. 踩坑一: 首先,这个是导出的流之间会互相影响,因为流读取过,导致导出的ex ...

  2. Vue笔记1

    index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  3. flink 并行计数器实现

    1.flink实现计数器的灵感来源于Hadoop的MapReduce计算框架里的理念. flink通过实现Accumulator接口实现并行计数.并行管理是由flink实现的. public inte ...

  4. 002-Zabbix 前端配置

    Zabbix 前端配置 [基于此文章的环境]点我快速打开文章 [官方地址]点我快速打开文章 第 1 步 在浏览器中,打开 Zabbix URL:http:// <server_ip_or_nam ...

  5. NAT网络地址转换的原理--笔试答题版

    最早接触NAT是在做网络工程师的时候,NAT是做网络工程师必需会的知识点和技能,后来在面试运维的时候也经常被用到,在运维的某些知识点当中也会被引用到,如LVS当中. 为什么需要NAT(网络地址转换)? ...

  6. C++随机马赛克图程序

    效果: 或者灰度,cell大小可调 代码: #include <opencv2\opencv.hpp> #include <Windows.h> struct paramete ...

  7. continue and break

    #1.continue终止当前循环开始下一次循环count = 0while count < 10: if count == 7: count = count +1 continue print ...

  8. This server is in the failed servers list: localhost/127.0.0.1:16000 启动hbase api调用错误

    api 调用发现错误 Mon Nov 18 23:04:31 CST 2019, RpcRetryingCaller{globalStartTime=1574089469858, pause=100, ...

  9. TVM:

    Hello TVM  发表于 2019-06-29 TVM 是什么?A compiler stack,graph level / operator level optimization,目的是(不同框 ...

  10. Excel-查找函数

    1.VLOOKUP函数 该函数的语法规则如下: VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) 多表关联查询---vlooku ...