写点什么

ngx.location.capture() 变量继承

  • 2025-11-06
    北京
  • 本文字数:2281 字

    阅读完需:约 7 分钟

本文分享自天翼云开发者社区《ngx.location.capture()变量继承》.作者:lucky_lyw

通过几个例子,简要分析 variable 与 ctx 在主请求与子请求中的关系。

copy_all_vars & share_all vars

server {    listen [::]:80;         #https配置-http访问端口v6格式    listen 80;              #https配置-http访问端口v4格式    #listen [::]:443 ssl;    #https配置-https访问端口v6格式    #listen 443 ssl;         #https配置-https访问端口v4格式
#ssl_certificate ssl/vsochina.com.crt; #ssl_certificate_key ssl/vsochina.com.key # ssl_certificate conf.d/common/ssl/vsochina.com.crt; #ssl_certificate_key conf.d/common/ssl/vsochina.com.key
server_name www.l.com;
location /static { root /root/resources/; } location /sub { content_by_lua_block { ngx.log(ngx.ERR, "sub: ", ngx.var.dysta) ngx.var.dysta = "luoyuwen" ngx.log(ngx.ERR, "sub: ", ngx.var.dysta) } } location /main { content_by_lua_block { ngx.var.dysta="luoluo" ngx.log(ngx.ERR, "main: ", ngx.var.dysta) res = ngx.location.capture("/sub", {copy_all_vars=true}) ngx.log(ngx.ERR, "main: ", ngx.var.dysta) res = ngx.location.capture("/sub", {share_all_vars=true}) ngx.log(ngx.ERR, "sub: ", ngx.var.dysta) } }}
2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:34):3: main: luoluo, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", host: "www.l.com"2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:23):2: sub: luoluo, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", subrequest: "/sub", host: "www.l.com"2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:23):4: sub: luoyuwen, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", subrequest: "/sub", host: "www.l.com"2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:34):5: main: luoluo, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", host: "www.l.com"2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:23):2: sub: luoluo, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", subrequest: "/sub", host: "www.l.com"2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:23):4: sub: luoyuwen, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", subrequest: "/sub", host: "www.l.com"2022/07/12 14:07:42 [error] 770#0: *6 [lua] content_by_lua(www.l.com.conf:34):7: sub: luoyuwen, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", host: "www.l.com"
复制代码

结论:

copy 仅赋值,share 共享


ctx

location /sub {        content_by_lua_block {            ngx.log(ngx.ERR, "sub: ", ngx.ctx.foo)            ngx.ctx.foo = "bar"            ngx.log(ngx.ERR, "sub: ", ngx.ctx.foo)        }    }        location /main {        content_by_lua_block {            ngx.ctx.foo = "luoluo"            local ctx = {}            ctx.foo = "mm"            ngx.log(ngx.ERR, "main: ", ngx.ctx.foo)            res = ngx.location.capture("/sub", {ctx=ctx})            ngx.log(ngx.ERR, "main: ", ngx.ctx.foo)            ngx.log(ngx.ERR, "main: ", ctx.foo)        }    }
2022/07/12 13:56:11 [error] 770#0: *4 [lua] content_by_lua(www.l.com.conf:35):5: main: luoluo, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", host: "www.l.com"2022/07/12 13:56:11 [error] 770#0: *4 [lua] content_by_lua(www.l.com.conf:23):2: sub: mm, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", subrequest: "/sub", host: "www.l.com"2022/07/12 13:56:11 [error] 770#0: *4 [lua] content_by_lua(www.l.com.conf:23):4: sub: bar, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", subrequest: "/sub", host: "www.l.com"2022/07/12 13:56:11 [error] 770#0: *4 [lua] content_by_lua(www.l.com.conf:35):7: main: luoluo, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", host: "www.l.com"2022/07/12 13:56:11 [error] 770#0: *4 [lua] content_by_lua(www.l.com.conf:35):8: main: bar, client: 127.0.0.1, server: www.l.com, request: "GET /main HTTP/1.1", host: "www.l.com"
复制代码


结论:

主请求与子请求中的 ctx 可以赋值并相互影响。

ngx.location.capture("/uri", {ctx_a = ctx_b})

ctx_a 为子请求中的 ngx.ctx,ctx_b 为主请求中的 ctx_b, 若该值为 ngx.ctx,则为主请求中的 ngx.ctx。

首先,将 ctx_b 赋值给子请求中的 ngx.ctx。

子请求中可查询 ngx.ctx,其值为主请求的 ctx_b

若在子请求中更改 ngx.ctx,则会映射到主请求中的 ctx_b

用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
ngx.location.capture()变量继承_CDN_天翼云开发者社区_InfoQ写作社区