Nginx变量
Nginx变量只有一种字符串类型,变量名前使用$符号来引用变量。但不支持通过转衣服来便是$符号,可使用ngx_geo模块来表示,如:
geo $dollar {
default "$";
},可使用$dollar来表示$。
Nginx的set指令首先在nginx启动加载配置时创建变量,而变量的赋值发生在请求处理的时候。其可见范围为整个Nginx配配置。但注意,Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。
内部跳转指的是在一个请求过程中从一个location跳转到另外一个的过程,由ngx_echo rewrite引起的。而外部跳转指的是状态码为301和302这样的跳转。在内部跳转中由于是同一个请求因此变量没有变化,即便location发生变化,仍是同一个副本。
Nginx变量分为两种,一种是set等指令创建的变量是用户自定义变量,另一种是Nginx预定义的内建变量,包含请求或响应的各种信息,如$uri回去经过解码不含参数的URI,而$request_uri表示未经解码包含参数的URI。需注意nginx会将参数名转为小写匹配。内建变量没有容器的概念,每次用时都需要nginx去计算得到。$args支持写操作,修改URL参数串。拥有值容器的变量在 Nginx 核心中被称为“被索引的” ;反之,则被称为“未索引的”。像 $arg_XXX 这样具有无数变种的变量群,是“未索引的”。 当读取这样的变量时,其实是它的“取处理程序”在起作用,即实时扫描当前请求的 URL 参数串,提取出变量名所指定的 URL 参数的值。
nginx map模块指令就可以用于定义两个 Nginx 变量之间的映射关系,
map $args $foo {
default 0;
debug 1;
},当 $args 的值等于 debug 的时候,$foo 变量的值就是 1,否则 $foo 的值就为 0。ngx_map 模块认为变量间的映射计算足够昂贵,需要自动将因变量的计算结果缓存下来,这样在当前请求的处理过程中如果再次读取这个因变量,Nginx 就可以直接返回缓存住的结果。ngx_geo模块也会缓存结果。
Nginx中请求分为主请求和子请求。主请求是 HTTP 客户端从 Nginx 外部发起的请求,而子请求是Nginx内部进行的请求,是把主请求拆分为多个更小力度的请求并行或串行的执行。由echo_location触发,子请求智键和主请求的变量都有各自独立的副本,ngx_echo, ngx_lua等也是。而ngx_auth_request触发的子请求与主请求共享变量容器,但会忽略子请求的响应体。
echo_location 第一个参数指定“子请求”的 URI ,第二个参数指定“子请求”的 URL 参数串。但通过$request_method和$request_uri获取的都主作用于主请求,$echo_request_method作用于子请求。
Nginx中变量创见了但未赋值则为不合法,而如果URL参数中没有要获取的参数则为没找到。但由于Nginx中只有一种字符串类型,因此都被转换为空字符串。获取“不合法”的变量在Nginx日志中有提示,而“未找到”没有,如果对该种变量作区分可借助lua中nil类型实现。如:
content_by_lua
'if ngx.var.arg_name == nil then
ngx.say("name: missing")
else
ngx.say("name: [", ngx.var.arg_name, "]")
end
';
当 $arg_name 的值为“没找到”( 或者“不合法”) 时为nil。