变量和请求
变量值容器的生命期是与请求绑定的,其实在
Nginx
世界里有两种类型的“请求”,一种叫做“主请求”(main request
),而另一种则叫做“子请求”(subrequest
)。
- 所谓“主请求”,就是由 HTTP 客户端从
Nginx
外部发起的请求。- “子请求”则是由
Nginx
正在处理的请求在Nginx
内部发起的一种级联请求。“子请求”在外观上很像 HTTP 请求,但实现上却和 HTTP 协议乃至网络通信一点儿关系都没有。它是
Nginx
内部的一种抽象调用,目的是为了方便用户把“主请求”的任务分解为多个较小粒度的“内部请求”,并发或串行地访问多个location
接口,然后由这些location
接口通力协作,共同完成整个“主请求”。当然,“子请求”的概念是相对的,任何一个“子请求”也可以再发起更多的“子子请求”,甚至可以玩递归调用(即自己调用自己)。当一个请求发起一个“子请求”的时候,按照Nginx
的术语,习惯把前者称为后者的“父请求”(parent request
)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
location /main { echo_location /foo; echo_location /bar; } location /foo { echo foo; } location /bar { echo bar; } //通过第三方 ngx_echo 模块的 echo_location 指令分别发起到 /foo 和 /bar 这两个接口的 GET 类型的“子请求”。 //$ curl "http://location:8080/main" //foo //bar |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
location /main { set $var main; auth_request /sub; echo "main: $var"; } location /sub { set $var sub; echo "sub: $var"; } //$ curl "http://location:8080/main" //main: sub //ngx_auth_request模块auth_request发起的“子请求”是与其“父请求”共享一套 Nginx 变量的值容器 |
1 2 3 4 5 6 7 8 9 10 11 12 |
location /main { echo "main args: $args"; echo_location /sub "a=1&b=2"; } location /sub { echo "sub args: $args"; } //$ curl 'http://localhost:8080/main?c=3' //main args: c=3 //sub args: a=1&b=2 |
1 2 3 4 5 6 7 8 9 10 11 12 |
location /main { echo "main uri: $uri"; echo_location /sub; } location /sub { echo "sub uri: $uri"; } //$ curl 'http://localhost:8080/main' //main uri: /main //sub uri: /sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
location /main { echo "main method: $request_method"; echo_location /sub; } location /sub { echo "sub method: $request_method"; } //$ curl --date hello 'http://localhost:8080//main' //main method: POST //sub method: POST location /main { echo "main method: $echo_request_method"; echo_location /sub; } location /sub { echo "sub method: $echo_request_method"; } //$ curl --data hello 'http://localhost:8080/main' //main method: POST //sub method: GET |
不合法&&没找到
当
Nginx
用户变量 \$foo 创建了却未被赋值时,\$foo 的值便是“不合法”;而如果当前请求的 URL 参数串中并没有提及XXX
这个参数,则 $arg_XXX 内建变量的值便是“没找到”。
1 2 3 4 5 6 7 8 9 10 11 |
location /foo { echo "foo = [$foo]"; } location /bar { set $foo 32; echo "foo = [$foo]"; } //$ curl 'http://localhost:8080/foo' //foo = [] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//空字符串 //$ curl 'http://localhost:8080/test?name=' //name: [] location /test { content_by_lua ' if ngx.var.arg_name == nil then ngx.say("name: missing") else ngx.say("name: [", ngx.var.arg_name, "]") end '; } //curl 'http://localhost:8080/test' //name: missing //curl 'http://localhost:8080/test?name=' //name: [] |
内建变量&&没找到
与 $arg_XXX 类似,内建变量 $cookie_XXX 变量也会在名为
XXX
的 cookie 不存在时返回特殊值“没找到”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
location /test { content_by_lua ' if ngx.var.cookie_user == nil then ngx.say("cookie user: missing") else ngx.say("cookie user: [",ngx.var.cookie,"]") end '; } //$ curl --cookie user=agentzh 'http://localhost:8080/test' //cookie user: [agentzh] //$ curl --cookie user= 'http://localhost:8080/test' //cookie user: [] //$ curl 'http://localhost:8080/test' //cookie user: missing |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Nginx 变量一10/26
- ♥ Reading 2021 《抗压力》07/31
- ♥ 正则表达式 _ 断言01/17
- ♥ 数据结构_二叉树节点10/16
- ♥ Reading 2020 《而已集》10/22
- ♥ Linux_ 命令大全 电子邮件与新闻组03/16