专栏中心

EEPW首页 > 专栏 > ngx.location.capture()变量继承

ngx.location.capture()变量继承

发布人:天翼云开发者 时间:2025-11-06 来源:工程师 发布文章

本文分享自天翼云开发者社区《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


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: 网络 CDN

相关推荐

8、16位MCU接入TCPIP网络方案

资源下载 2008-01-05

我国西部首个,重庆算力互联互通平台在两江新区上线

HTML 解析之 BeautifulSoup

网络爬虫开发常用框架Scrapy

Addison.Wesley.Advanced.Linux.Networking.part3.rar

Addison.Wesley.Advanced.Linux.Networking.part4.rar

教程:设置内置逻辑的 IO-Link 网络

Coherent推出全系列InP技术组合

中国首例!我国对美国相关光纤产品发起反规避调查

超高速光纤创下全球速度纪录:在欧式距离上达到1.02拍比特每秒

AI网络架构或将进入“无交换机”时代

2025-06-12

Addison.Wesley.Advanced.Linux.Networking.part1.rar

SDN可编程交换芯片架构核心:RMT,一个可编程的网络DSA

网络与存储 2024-07-31

Addison.Wesley.Advanced.Linux.Networking.part2.rar

GSMA:全球 43% 的人口仍未使用移动互联网

更多 培训课堂
更多 焦点
更多 视频

技术专区