map模块和我们常用的switch.....case类似,它默认是被编译进nginx中的,可以使用--without-http_map_module进行禁用。
一、指令
- map:map string variable为相当于用于存储case返回的值的变量。存在的上下文为http。
- map_hash_bucket_size:size,值为32|64|128。
- map_hash_max_size:和map_hash_bucket_size一样,与变量存储的哈希表的大小有关。
二、内容匹配规则
相当于case匹配规则:
- 字符串严格匹配。
- 使用hostnames指令,可以对域名使用前缀*泛域名匹配、后缀泛*域名匹配。
- ~和~*正则表达式匹配,后者忽略大小写。
匹配的顺序也是这样。
当map里面的代码规则太多时,会影响代码的可读性,就可以将map这部分提出到另外的文件中,使用include引入即可。
三、案例
nginx配置:
map $http_host $name { hostnames; default 0; ~map\.fxt\w+\.test.cn 1; *.test.cn 2; fxt.test.tech 3; fxt.test.* 4; } map $http_user_agent $mobile { default 0; "~Opera Mini" 1; } server { listen 80; server_name fxt.test.com localhost; access_log logs/test.log vartest; location / { return 200 '$name:$mobile'; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
1、终端输入:curl -H 'Host: map.fxt.test.cn' localhost:80,打印出2:0,即name值为2,mobile值为0,说明http_host匹配上的是*.test.cn,http_user_agent匹配上的是默认值0。
2、终端输入:curl -H 'Host: map.fxt.test.tech' localhost:80,打印出0:0,即name值为默认值0,http_user_agent匹配上的是默认值0
3、终端输入:curl -H 'Host: fxt.test.tech' localhost:80,打印出3:0,即name值为3,匹配上的是fxt.test.tech,mobile值为0,说明http_user_agent匹配上的是默认值0。
4、终端输入:curl -H 'Host: fxt.test.org' localhost:80,打印出4:0,即name值为4,匹配上fxt.test.*,mobile值为0,说明http_user_agent匹配上的是默认值0。