map模块

183 阅读1分钟

     map模块和我们常用的switch.....case类似,它默认是被编译进nginx中的,可以使用--without-http_map_module进行禁用。

一、指令

  • map:map string variable......,这里string也可为变量,相当于swicth中的变量,variable {......},这里string也可为变量,相当于swicth中的变量,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。