Nginx Map模块(Map)

案例

map $args $foo {  
default     0;  
debug       1;  
}  
server {  
listen 8080;  
location /test {  
set $orig_foo $foo;  
set $args debug;  
echo "orginal foo: $orig_foo";  
echo "foo: $foo";  
}  
}  

而 Nginx 的这个 map 指令就可以用于定义两个 Nginx 变量之间的映射关系,或者说是函数关系。回到上面这个例子,我们用 map 指令定义了用户变量 $foo 与 $args 内建变量之间的映射关系。特别地,用数学上的函数记法 y = f(x) 来说,我们的 $args 就是“自变量” x,而 $foo 则是“因变量” y,即 $foo 的值是由 $args 的值来决定的,或者按照书写顺序可以说,我们将 $args 变量的值映射到了 $foo 变量上。

curl 'http://localhost:8080/test'  
original foo: 0  
foo: 0  

++original foo: 0 容易理解,为什么foo: 0 呢?
因为set $orig_foo $foo; 的时候已经获取过$foo 变量的值了,此时URL参数为空于是$args 的最初值为空,所以$foo 为0,当set $args debug; 之后再去取值的时候实际上 $foo不会再重新计算值了,而是直接取上次计算的缓存数据所以还是0.==++



$curl 'http://localhost:8080/test?debug' original foo:1 foo:1

map指令用来创建变量,仅在变量被接受的时候执行视图映射操作。 map指令配置段位于http段内。 map指令有三个参数: default:默认值,当没有设置 default,将会用一个空的字符串作为默认的结果。 hostnames:允许用前缀或者后缀掩码指定域名作为源变量值。(这个参数必须写在值映射列表的最前面) include:包含一个或多个含有映射值的文件。
可以使用正则表达式:
    以 ~ 开头,表示这个正则表达式对大小写敏感。
以 ~*开头,表示这个正则表达式对大小写不敏感。

使用示例


http { map $http_user_agent $agent { ~curl curl; ~*chrome chrome; } server { listen 8080; server_name www.test.com; location /hello { default_type text/plain; echo http_user_agent: $http_user_agent; echo agent: agent:$agent; } } }
参考地址:
https://blog.csdn.net/jiangzhexi/article/details/53665652
https://www.landui.com/help/show-6577.html

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注