Nginx篇04——map模块

nginx的map模块配置语法。

map模块是由ngx_http_map_module模块提供的,只能在http模块下使用,nginx默认自带安装。map 的主要作用简单来说就和编程语言中的赋值语句有点像,只不过这里称为映射(map)。具体来说是创建一个自定义变量,去匹配某些指定的字符串或者是正则表达式,如果匹配成功则将该匹配值赋值给该自定义变量,然后该自定义变量可以作其他用途。

1、语法格式

我们先来看一下官网给出的语法格式:

1
2
3
Syntax:	map string $variable { ... }
Default: —
Context: http

实际上现在的版本中map指令后面的第一个参数也就是源变量可以是字符串、正则表达式或者是另一个变量。因此这样表示会更容易理解一些。

1
Syntax:	map $source_var $result_var { ... }

此外,map模块内还有defaulthostnamesincludevolatile这四个关键字可以使用

  • default:使用方法为 default value,主要用于给源变量设定默认值,如果源变量没有匹配到模块中指定的任何一个,则设为指定的value,如果不指定default,则会设定为一个空字符串(NULL)
  • hostnames:指定源变量可以为域名,并且可以使用前缀掩码或者后缀掩码,如*.example.com或者mail.*
  • include:使用方法为include file,指定一个带有变量的文件,可以使用多次
  • volatile:指明该变量不可缓存

我们来看一个复杂一点的配置文件

1
2
3
4
5
6
7
8
9
10
11
map $http_host $name {
default 0;
hostnames;
volatile;
*.example.com 1;
*.example.org 2;
*.example.net 3;
mail.* 4;
mail.example.com 5;
include /var/www/html/host.list;
}

需要注意这里的include使用的文件格式应该如下:

1
2
3
4
$source_var0 $result_var0;
$source_var1 $result_var1;
...
$source_varN $result_varN;

例如:

1
2
nginx.example.com 7;
awesome.example.com 8;

2、注意事项

这里有几点需要注意:

  • map指令只能在http块中使用;
  • 如果源变量是字符串,那么在匹配的时候是不区分大小写的;
  • 在0.9.0版本之前只能指定单个源变量;
  • 0.9.6版本之后的源变量可以是字符串或者正则表达式;
  • 正则表达式中,开头“~”为大小写敏感,“~*”为大小写不敏感,正则表达式必须以这两者中的一个开头;
  • 需要匹配的的源变量中有特殊符号的需要使用反斜杠\来进行转义;
  • 0.9.0版本中源变量可以使用变量,1.11.0版本中源变量可以使用变量和字符串的组合;
  • map指令对应的结果变量($result_var)只有在之后的配置文件中使用到了该结果变量的时候,才会使用前面定义的map模块来进行映射,因此即使定义了很多个map模块,也不会对性能有额外的影响;

3、匹配顺序

当map块中指定的映射关系有多个可以匹配的时候,按照以下的优先顺序进行匹配:

  1. 完整指定没有使用掩码的指定变量,e.g.“mail.example.com”;
  2. 带有前缀掩码的最长字符串值, e.g. “*.nginx.example.com”就会比 “*.example.com”优先匹配;
  3. 带有后缀掩码的最长字符串值, e.g. “mail.nginx.*”就会比 “mail.*”优先匹配;
  4. 按照配置文件中出现的先后顺序匹配的第一个正则表达式;
  5. 设定的default值;

个人记忆口诀:先整再缺,先前再后;先长再短,先实再虚;无则默认,不行查表。