Nginx的map指令的使用

map指令是由ngx_http_map_module模块提供的, 默认情况下安装nginx都会安装该模块.

map 的主要作用是创建自定义变量, 通过使用nginx的内置变量, 去匹配某些特定规则, 如果匹配成功则设置某个值给自定义变量. 而这个自定义变量又可以作于他用.

场景:

匹配请求url的参数, 如果参数是debug则设置$foo = 1, 默认设置$foo = 0

map $args $foo {
    default 0;
    debug   1;
}

解释:

$args是nginx内置变量, 就是获取的请求 url 的参数. 如果$args匹配到debug, 那么$foo的值会被设为1, 如果$args一个都匹配不到$foo就是default定义的值, 这里就是0.

另一个例子:

    # 指定域名或者泛域名分片缓存
    map $channel $slice_store {
        hostnames;
        default         off;
    }

通过以上代码来说明map的一些用法:

map只能用于http上下文;

只有变量slice_store在使用的时候才会被赋值, 所以即使有很多条map语句, 对于没有使用该变量的清气来说也不会产生任何额外开销;

由上一条说明可知$channel变量可以在之后再定义;

hostnames是map的一个参数, 并不是作为channel变量的值存在的;

参数hostnames必须在map块的第一行, hostnames表明channel变量的值可以是有前缀或者是有后缀的域名, 比如channel变量的值如果是: *.example.com on或者是example.* off等, 那么slice_store变量的值就是onoff, 如果channel变量值是*.example.com "" 或者channel变量没有值, 那么slice_store变量值将是default的值off.