nginx: ngx_http_map_module

陪她去流浪 桃子 2015年04月16日 编辑 阅读次数:3007

ngx_http_map_module 模块根据一个变量的值创建另一个新的变量,新的变量的值取决于映射条件。

指令

语法map string $variable { ... }
默认 
环境http

根据 string 指定的一个或多个源变量的值创建新的变量 $variable

注:在 版本0.9.0 之前,第一个参数仅能指定一个变量。

注:由于变量仅会在用到它们的地方才会被评估,所以就算有很多的“map”,也不会给请求处理增加额外的消耗。

map块 内的参数指定了从源变量值到结果之间的一种简单的映射关系。源变量值用字符串或正则表达式的方式来指定。以“~”开始的正则表达式用于区分大小写匹配,以“~*”开始的正则表达式用于不区分大小写匹配。正则表达式还可以包含命名的或基于位置的捕捉组,它们可以随新变量一起在后续的指令中使用。

如果源值匹配下面将要描述的名字之一,那么该源变量应该以“\”开始以避免误解。

结果值可以是一个字符串或另一个变量(0.9.0)。

该指令也支持以下三个特殊的参数:

default value
设置默认值,用于当源变量的值不能匹配任何一个指定的条件之时。如果不指定 default,新变量的值将会是空串。
hostnames
指示源值可以是拥有前缀或后缀的 hostnames
*.example.com   1;
example.*       1;
以下的记录
example.com     1;
*.example.com   1;
可以合并成如下一个:
.example.com    1;
该参数应该放在值列表的最前面。
include file
包含某文件。可以有多个包含语句。

如果源变量的值能够匹配不只一个变体值,比如:同时匹配一个掩码或一个正则表达式,那么将会按如下的优先级顺序选择变体:

  1. 包含有掩码的字符串值
  2. 包含前缀掩码的最长的字符串,比如:“*.example.com”
  3. 包含后缀掩码的最长的字符串,比如:“mail.*”
  4. 第一个出现的正则表达式(按在配置文件中出现的顺序)
  5. 默认值
语法map_hash_bucket_size size;
默认map_hash_bucket_size 32|64|128;
环境http

设置 map 指令变量的哈希表的大小。

默认大小依赖于处理器的缓存线(cache line)的大小。设置哈希表的详细文档见:哈希表文档

语法map_hash_max_size 2048;
默认 
环境http

设置 map 指令变量的哈希表的最大大小。

设置哈希表的详细文档见:哈希表文档

示例配置

判断是否是用Opera浏览器的移动设备:
map $http_user_agent $mobile {
    #如果用户代理中包含“Opera Mini”那么 $mobile 将是 “1”。
    default       0;
    "~Opera Mini" 1;
}
控制访问日志记录,映射HTTP状态码到变量:
map $status $loggable {
    #非2xx和非3xx的代码将使 $loggable 的值为 “0”
    ~^[23]  0;
    default 1;
}

标签:nginx