Nginx篇04-map模块
本文最后更新于:March 20, 2020 am
nginx的map模块配置语法。
map模块是由ngx_http_map_module
模块提供的,只能在http模块
下使用,nginx默认自带安装。map 的主要作用简单来说就和编程语言中的赋值语句有点像,只不过这里称为映射(map)。具体来说是创建一个自定义变量,去匹配某些指定的字符串或者是正则表达式,如果匹配成功则将该匹配值赋值给该自定义变量,然后该自定义变量可以作其他用途。
1、语法格式
我们先来看一下官网给出的语法格式:
1 |
|
实际上现在的版本中map指令后面的第一个参数也就是源变量可以是字符串、正则表达式或者是另一个变量。因此这样表示会更容易理解一些。
1 |
|
此外,map模块内还有default
、hostnames
、include
、volatile
这四个关键字可以使用
default
:使用方法为default
value,主要用于给源变量设定默认值,如果源变量没有匹配到模块中指定的任何一个,则设为指定的value,如果不指定default
,则会设定为一个空字符串(NULL)hostnames
:指定源变量可以为域名,并且可以使用前缀掩码或者后缀掩码,如*.example.com
或者mail.*
include
:使用方法为include
file,指定一个带有变量的文件,可以使用多次volatile
:指明该变量不可缓存
我们来看一个复杂一点的配置文件
1 |
|
需要注意这里的include使用的文件格式应该如下:
1 |
|
例如:
1 |
|
2、注意事项
这里有几点需要注意:
- map指令只能在http块中使用;
- 如果源变量是字符串,那么在匹配的时候是不区分大小写的;
- 在0.9.0版本之前只能指定单个源变量;
- 0.9.6版本之后的源变量可以是字符串或者正则表达式;
- 正则表达式中,开头“
~
”为大小写敏感,“~*
”为大小写不敏感,正则表达式必须以这两者中的一个开头; - 需要匹配的的源变量中有特殊符号的需要使用反斜杠
\
来进行转义; - 0.9.0版本中源变量可以使用变量,1.11.0版本中源变量可以使用变量和字符串的组合;
- map指令对应的结果变量(
$result_var
)只有在之后的配置文件中使用到了该结果变量的时候,才会使用前面定义的map模块来进行映射,因此即使定义了很多个map模块,也不会对性能有额外的影响;
3、匹配顺序
当map块中指定的映射关系有多个可以匹配的时候,按照以下的优先顺序进行匹配:
- 完整指定没有使用掩码的指定变量,e.g.“
mail.example.com
”; - 带有前缀掩码的最长字符串值, e.g. “
*.nginx.example.com
”就会比 “*.example.com
”优先匹配; - 带有后缀掩码的最长字符串值, e.g. “
mail.nginx.*
”就会比 “mail.*
”优先匹配; - 按照配置文件中出现的先后顺序匹配的第一个正则表达式;
- 设定的default值;
个人记忆口诀:先整再缺,先前再后;先长再短,先实再虚;无则默认,不行查表。