ngx.location.capture()变量继承

天翼云开发者社区
• 阅读 15

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

点赞
收藏
评论区
推荐文章
浅谈Tox之二
本文分享自天翼云开发者社区《》,作者:Moonriver1.配置加载tox.ini并将其与命令行和操作系统环境变量中的选项合并。2.包装(可选)通过调用pythonsetup.pysdist创建当前项目的源代码版本库。注意对于此操作,Python环境将与安
启动Tomcat时报错,提示80端口被占用怎么办?
本文分享自天翼云开发者社区《》,作者:wn本节操作以WindowsServer2019Datacenter操作系统的弹性云主机为例介绍排查80端口占用的操作步骤。可能原因提示80端口被占用,由提示可知,该端口可能是被其他程序占用,包括被木马病毒占用,可以按
WAAP对提升网站访问速度有什么作用?
本文分享自天翼云开发者社区《》,作者:amberWAAP(WebApplicationandAPIProtection)对提升网站访问速度具有显著作用,主要体现在以下几个方面:1.网络性能优化:WAAP通过优化网络性能来提升用户体验。网络攻击可能导致网站和
构建多维打标签算法
本文分享自天翼云开发者社区《》,作者:石泽涛针对各类主题,通过对用户DPI访问数据深度解析,体现数据价值,丰富云产品形态与应用范围;建立行业的标签,能够对用户访问各类APP和网站的行为和内容有深入细致的刻画,为主题运营工作提供必要的数据支撑。在获客成本越来
NFS使用
本文分享自天翼云开发者社区《》,作者:2m安装nfsnfs依赖于rpc,故需安装nfsutilsrpcbindyuminstallynfsutilsrpcbind​指定nfs监听端口vim/etc/sysconfig/nfs​RQUOTADPORT3000
一种CDN动态加速首次访问加速方法
本文分享自天翼云开发者社区《》.作者:蒋辉具体方案如下:1.对于全站加速,节点内部的探测采用的非请求触发式探测(已实现),在首次访问时,使用配置的顶层父方案作为回源节点回源,具体如下:masterparentarea:"area.parent1st.ctc
在nginx中实现回源日志的功能
本文分享自天翼云开发者社区《》.作者:尹聪nginx中已经提供了访问日志的功能,主要对客户端的访问状态等进行记录,比如响应给客户端的状态码,请求uri,请求协议等。而对于回源(或者回后端)的请求状态记录较少,如后端的地址、端口、状态码等这些有记录。在反向代
Nginx的请求处理
本文分享自天翼云开发者社区《》.作者:小谢不用谢三级标题Nginx的请求处理流程worker进程中,ngxworkerprocesscycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:(1)操作系统提供的机制(例如epo
openresty中使用ngx.sleep(0)防止worker进程阻塞
本文分享自天翼云开发者社区《》.作者:小谢不用谢1.ngx.sleep(0)的工作原理在OpenResty中,ngx.sleep(0)函数的作用是让当前的Lua协程主动放弃CPU执行权,以便Nginx能够及时处理其他并发请求和I/O操作。具体来说,调用ng
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
963
粉丝
16
获赞
40