动态

详情 返回 返回

ngx.location.capture()變量繼承 - 动态 详情

本文分享自天翼雲開發者社區《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
user avatar gaodadepijiu 头像 godjian 头像
点赞 2 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.