worker_processes auto;
daemon off;
events {
worker_connections 256;
}
http {
geo $dollar {
default "$";
}
map $args $soo {
default 0;
debug 1;
bug 2;
}
# 如果args==左边的key值,那么soo的值映射为右边的值,如果左边都不匹配则映射为default的值
server {
listen 8080;
location /test {
echo "This is a dollar sign: $dollar"; # $无法被转义
echo "$dollar, $dollar";
set $a "hello ";
echo "${a}world"; # 连着了 消歧方法
}
# Nginx 变量的创建和赋值操作发生在全然不同的时间阶段。Nginx
# 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;
# 而赋值操作则只会发生在请求实际处理的时候。
location /foo {
echo "foo = [$foo]"; # 不会报错 但是值为空,Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。
}
location /bar {
set $foo 32; # 变量名的可见范围是整个 Nginx 配置
echo "foo = [$foo]";
}
# 内部跳转
# Nginx 变量的生命期是与当前正在处理的请求绑定的,与location无关
location /foo1 {
set $a hi;
echo_exec /bar1;
# rewrite ^ /bar; # 另外一种内部跳转方式
}
location /bar1 {
echo "a = [$a]"; # a = [hi] 当前正在处理的请求就还是原来那个
}
# 内建变量
# 许多内建变量都是只读的,对只读变量进行赋值是应当绝对避免的, $args内建变量是可以修改的
location /uri {
echo "uri = $uri"; #获取当前请求的 URI(经过解码,并且不含请求参数)
echo "request_uri = $request_uri"; # 获取请求最原始的 URI(未经解码,并且包含请求参数)
}
location /arg {
set $name $arg_name;
set_unescape_uri $name1 $arg_name; # uri解码
echo "name: $name"; # name: ashin%20chen
echo "name1: $name1"; # name1: ashin chen
}
# 映射
location /map {
set $orig_soo $soo;
echo "original soo: $orig_soo";
set $args debug;
echo "soo: $soo";
set $args bug;
echo "soo: $soo";
}
# echo出的值都相同,因为变量在第一次读取时,根据映射规则计算出的 值被缓存住了。并非所有的变量都会缓存结果,$arg_XXX就不会
#子请求
location /main {
set $var main;
echo_location /m1; #ngx_echo,ngx_lua,以及ngx_srcache在内的许多第三方模块都选择了禁用父子请求间的变量共享。“主请求”以及各个“子请求”都拥有不同的变量$var的值容器副本
echo_location /m2;
echo "main: $var";
}
location /m1 {
set $var m1;
echo "m1: $var";
}
location /m2 {
set $var m2;
echo "m2: $var";
}
# 数组
location /arr {
array_split "," $arg_names to=$array1;
# 将names参数值按照逗号切分保存在$array1变量中
array_map "[$array_it]" $array1;
# 将$array1中的item以[ITEM]的形式进行map操作
array_join " " $array1 to=$res;
# 将$array1按照空格进行join成为新的字符串后赋值到$res
echo $res;
}
}
}
发表评论
亲~ 评论内容是必须的哟! o(∩_∩)o
昵称
邮箱
主页
评论