在最近的项目中涉及到map指令的处理,用起来还是有点感觉的,所以看了一下源码实现,现整理了一下供大家参考!如有错误,欢迎指正。
配置语法
Syntax: | map |
---|---|
Default: | — |
Context: | http |
配置示例
注解:
map是nginx指令
$http_referer表示获取请求的Referer信息
$is_valid表示最后匹配的结果
default 0; pass 1; ~csdn* 1;:表示判断匹配的条件(具体是拿Referer的值进行匹配,匹配到之后,将对应的值赋值给变量$is_valid)
源码分析
配置解析
配置解析的大入口为char * ngx_http_map_block()。
1.首先是针对$http_referer的解析,其主要目的是确定$http_referer变量在全局变量数组(cmcf->variables)中的索引位置及设置获取变量value的回调
2.处理$is_valid变量,将该变量作为一个nginx内部变量插入到全部变量数组中,设置了该变量获取的回调函数ngx_http_map_variable()
3.处理default 0; pass 1; ~csdn* 1;配置信息,此时需要进入新函数ngx_http_map。
针对key的处理方式存在两种:a、非正则形式,将所有key保存到一张hash表中;b、正则形式,将正则放到一个数组中。
针对value的处理方式也存在两种方式:a、变量形式:如果value是变量,参照1中的处理方式,获取全局变量数据中的索引位置保存起来,后续使用时,直接从变量数组中获取对应的变量值;b、非变量形式,直接保存该固定字符串
指令使用
$is_valid变量的使用,就相对比较简单了。优先正则查找一番,没有的话,在正则查找
注意事项
1.该map执行只能在http块中配置
2.$is_valid变量不能在lua中进行赋值
3.也可以通过inclue属性包含文件