变量和请求
变量值容器的生命期是与请求绑定的,其实在
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 2025 记录02/12
- ♥ Objective-C 解析plist04/28
- ♥ Linux fork&&守护进程03/30
- ♥ 表_创建 && 操作10/26
- ♥ C++标准模板库编程实战_适配器12/07
热评文章
- Nginx 变量一 0
- Nginx 整体结构 0
- Nginx目录结构 0
- Nginx编译与安装 0