map指令简单介绍

当然这里写的都是官方文档是已经写过的,我简单抄一下哈。

map指令来自于 ngx_http_map_module 模块,提供的核心能力是 基于一个变量创建一个新变量,大概是这意思。

语法: 只能配置在http块内
map string $variable {...}

直接看这个语法好像看不出来它能干什么,所以官方文档上给了几个例子:

map $http_host $name {
hostnames; default 0; example.com 1;
*.example.com 1;
example.org 2;
*.example.org 2;
.example.net 3;
wap.* 4;
}

解析一下上面这个例子的意思:

map: 关键字,开辟一段内存空间声明一个map

$http_host: 获取host请求头:eg: www.baidu.com

$name: 新变量,具体取值是什么取决于结构体内的映射关系

结构体内的数据解析:
hostnames:
- 官方文档给出的解释是:允许用前缀或者后缀掩码指定域名作为源变量值。这个参数必须写在值映射列表的最前面。 读都能读的懂,字也都认识,但是怎么感觉好像还是不太懂呢,又没有同感?于是我测试了一下,其实就是你想用下面那种泛域名来匹配host的话就加一下这个参数, 否则是达不到预期效果的。 default 0; :匹配不到符合条件的数据时 则$name 这个变量就取默认值 0

知道了这之后我能用它来做什么呢?看实际应用的例子

map指令的实践使用

1. 基于cookie做多环境分流

一般中大型公司都会有多套测试环境,对于多环境的访问可能最容易想到的就是对应多个域名,这方法当然可以,但是不优雅,维护多个域名太累。为了偷懒,我们用了一个域名,使用不同的cookie来转发相应的流量到相应的环境。

如何实现?

    map $cookie_cl_env_num $cl_backend_map {
default 1.1.1.1:80;
dev-01 upstream_dev-01;
dev-02 upstream_dev-02;
dev-03 upstream_dev-03;
test-01 upstream_test-01;
test-02 upstream_test-02;
test-03 upstream_test-03;
test-04 upstream_test-04;
test-05 upstream_test-05;
test-06 upstream_test-06;
test-07 upstream_test-07;
test-08 upstream_test-08;
test-09 upstream_test-09;
test-10 upstream_test-10;
test-11 upstream_test-11;
test-12 upstream_test-12;
test-13 upstream_test-13;
test-14 upstream_test-14;
test-15 upstream_test-15;
} # 随便写一个
upstream upstream_test-14 {
server 2.2.2.2:80;
} # 局部实现写一下
location / {
pass_pass http://$cl_backend_map;
} # 请求
curl --cookie "cl_env_num=test-15" a.test.com/api/v1/hahaha

这不就实现了嘛,很方便哈。仅提供思路!当然也可以使用其他变量来分流 UA|args ...

2. 做安全的多域名跨域访问

跨域访问一般情况下我们都会直接设置 * 允许所有跨域访问。但是难免会有一些对安全性要求较高的业务不允许这样,那么对于域名比较多的安全跨域配置,也可以使用map来实现。

map $http_origin $allow_origin {
~http://www.baidu.com http://www.baidu.com;
~http://m.baidu.com http://m.baidu.com;
~http://a.baidu.com http://a.baidu.com;
default deny;
} server {
listen 80;
server_name www.baidu.com; location / {
...
add_header Access-Control-Allow-Origin $allow_origin;
...
}
}

仅提供思路哈,具体情况可以再优化

总结

当然还有很多场景都可以用到, 无法一一列举, 自己能够根据需求和场景灵活运用是最好的。

震惊--Nginx的map指令还能这样用的更多相关文章

  1. Nginx的mirror指令能干啥?

    mirror 流量复制 Nginx的 mirror 指令来自于 ngx_http_mirror_module 模块 Nginx Version > 1.13.4 mirror 指令提供的核心功能 ...

  2. Nginx基础配置指令

    nginx.conf文件的结构 ... #全局块 events{ #events块 ... } http{ #http块 ... #http全局块 server{ #server块 ... #serv ...

  3. nginx 配置优化指令

    worker_processes worker_processes指令是用来设计Nginx进程数,官方默认设为1,赋值太多了,将会对系统IO影响效率,降低Nginx服务器性能.但是为了让多核CPU能够 ...

  4. nginx:location指令中的正则表达式

    nginx:location指令中的正则表达式 uri匹配步骤 官网说明https://docs.nginx.com/nginx/admin-guide/web-server/web-server/ ...

  5. (转)nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  6. nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  7. [Linux] nginx的try_files指令实现隐藏index.php的重写

    1.nginx的try_files指令 ,核心功能是替代rewrite,并且比rewrite更强大的是可以按顺序查找文件是否存在,如果文件都找不到才会执行最后的重定向解决的问题是,如果一个网站的部署是 ...

  8. ffmpeg第7篇:数据流选择神器-map指令

    自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ...

  9. Nginx源码研究七:nginx的location指令分析

    在nginx的配置文件nginx.conf中,我们在配置server的时候,会配置一下location指令,这个location指令是提供给用户来配置对于符合指令的http请求,采用该指令内部的处理方 ...

随机推荐

  1. LIKE 声明中的%和_是什么意思?

    %对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符. 如何在 Unix 和 MySQL 时间戳之间进行转换? UNIX_TIMESTAMP 是从 MySQL 时间戳转换为 Unix 时间戳 ...

  2. pandas - drop()函数

    函数形式:DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors ...

  3. 在网页中预览excel表格文件

    项目需求在前端页面中实现预览excel表格的功能,上网了解之后大致总结为一下几种方法. 1.office文档转换为pdf,再转swf,然后通过网页加载flash进行预览 2.通过 xlsx.js,js ...

  4. TTL 机制排毒,线上k8s的Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job?

    TTL 机制排毒,线上k8s的Job已经通过API 增加了Job的TTL 时长,且成功响应,为什么系统还是清理了Job? 面试官:"已完成 Job 的 TTL 机制了解嘛?简单说说TTL存在 ...

  5. java继承时能包括静态的变量和方法吗?举例说明!

    子类继承了超类定义的所有实例变量和方法包括静态的变量和方法(马克-to-win见下例),并且为它自己增添了独特的元素.子类只能有一个超类.Java不支持多超类的继承. 子类拥有超类的所有成员,但它不能 ...

  6. 安卓xml布局中 android:paddingBottom="@dimen/activity_vertical_margin"是什么意思?

    @dimen/activity_vertical_margin 是什么意思? @dimen/activity_vertical_margin这个的意思就是在你的values文件夹下面的dimens文件 ...

  7. MySQL数据库设置编码格式和时区

    MySQL数据库设置编码格式和时区 MySQL5版本: url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8 MySQL6版本及以上 ...

  8. 下载jar包方法

    第一种通用下载jar包方法 apache官网下载jar包地址:http://ftp.cuhk.edu.hk/pub/packages/apache.org/   第二种通用下载jar包方法  mave ...

  9. Exchange日志清理

    1.清理日志--完整备份 Exchange Server 2013被部署在Windows Server 2012 及以上版本的操作系统中,使用操作系统内的"Windows Server Ba ...

  10. 解决vue安装时出现vue --version或vue不是内部命令的问题

    1. 试图全局配置 vue 的环境变量,找到 vue.cmd 的路径,然后进行配置. 问题:在文件搜索中,没有找到 vue.cmd,失败. 1.npm i npm -g 全局 update 了 npm ...