`
风过无声
  • 浏览: 92076 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Nginx 变量漫谈(八)无题 (转载)

 
阅读更多

转载自 http://blog.sina.com.cn/openresty

 

 与 $arg_XXX 类似,我们在 (二) 中提到过的内建变量 $cookie_XXX 变量也会在名为 XXX 的 cookie 不存在时返回特殊值“没找到”:

    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_user, "]")

            end

        ';

    }

利用 curl 命令行工具的 --cookie name=value 选项可以指定 name=value 为当前请求携带的 cookie(通过添加相应的 Cookie 请求头)。下面是若干次测试结果:

    $ 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

我们看到,cookie user 不存在以及取值为空字符串这两种情况被很好地区分开了:当 cookie user 不存在时,Lua 代码中的 ngx.var.cookie_user 返回了期望的 Lua nil 值。

 

    在 Lua 里访问未创建的 Nginx 用户变量时,在 Lua 里也会得到 nil 值,而不会像先前的例子那样直接让 Nginx 拒绝加载配置:

    location /test {

        content_by_lua '

            ngx.say("$blah = ", ngx.var.blah)

        ';

    }

这里假设我们并没有在当前的 nginx.conf 配置文件中创建过用户变量 $blah,然后我们在 Lua 代码中通过 ngx.var.blah 直接引用它。上面这个配置可以顺利启动,因为 Nginx 在加载配置时只会编译 content_by_lua 配置指令指定的 Lua 代码而不会实际执行它,所以 Nginx 并不知道 Lua 代码里面引用了 $blah 这个变量。于是我们在运行时也会得到 nil 值。而 ngx_lua 提供的 ngx.say 函数会自动把 Lua 的 nil 值格式化为字符串 "nil" 输出,于是访问 /test 接口的结果是:

    curl 'http://localhost:8080/test'

    $blah = nil

这正是我们所期望的。

 

    上面这个例子中另一个值得注意的地方是,我们在 content_by_lua 配置指令的参数中提及了 $bar 符号,但却并没有触发“变量插值”(否则 Nginx 会在启动时抱怨 $blah 未创建)。这是因为 content_by_lua 配置指令并不支持参数的“变量插值”功能。我们前面在 (一) 中提到过,配置指令的参数是否允许“变量插值”,其实取决于该指令的实现模块。

 

    设计返回“不合法”这一特殊值的例子是困难的,因为我们前面在 (七) 中已经看到,由 set 指令创建的变量在未初始化时确实是“不合法”,但一旦尝试读取它们时,Nginx 就会自动调用其“取处理程序”,而它们的“取处理程序”会自动返回空字符串并将之缓存住。于是我们最终得到的是完全合法的空字符串。下面这个使用了 Lua 代码的例子证明了这一点:

    location /foo {

        content_by_lua '

            if ngx.var.foo == nil then

                ngx.say("$foo is nil")

            else

                ngx.say("$foo = [", ngx.var.foo, "]")

            end

        ';

    }

 

    location /bar {

        set $foo 32;

        echo "foo = [$foo]";

    }

请求 /foo 接口的结果是:

    $ curl 'http://localhost:8080/foo'

    $foo = []

我们看到在 Lua 里面读取未初始化的 Nginx 变量 $foo 时得到的是空字符串。

 

    最后值得一提的是,虽然前面反复指出 Nginx 变量只有字符串这一种数据类型,但这并不能阻止像 ngx_array_var 这样的第三方模块让 Nginx 变量也能存放数组类型的值。下面就是这样的一个例子:

    location /test {

        array_split "," $arg_names to=$array;

        array_map "[$array_it]" $array;

        array_join " " $array to=$res;

 

        echo $res;

    }

这个例子中使用了 ngx_array_var 模块的 array_split、 array_map 和 array_join 这三条配置指令,其含义很接近 Perl 语言中的内建函数 split、map 和 join(当然,其他脚本语言也有类似的等价物)。我们来看看访问 /test 接口的结果:

    $ curl 'http://localhost:8080/test?names=Tom,Jim,Bob

    [Tom] [Jim] [Bob]

我们看到,使用 ngx_array_var 模块可以很方便地处理这样具有不定个数的组成元素的输入数据,例如此例中的 names URL 参数值就是由不定个数的逗号分隔的名字所组成。不过,这种类型的复杂任务通过 ngx_lua 来做通常会更灵活而且更容易维护。

 

分享到:
评论

相关推荐

    nginx内置变量

    **Nginx内置变量概述** Nginx是一个高性能的HTTP和反向代理服务器,它具有模块化设计和出色的并发处理能力。在Nginx配置中,内置变量扮演着至关重要的角色,它们允许管理员动态地获取关于请求、客户端、服务器状态...

    nginx自定义变量与内置预定义变量的使用

    在Nginx中,变量是实现灵活配置的关键要素。它们允许你存储和引用动态数据,以适应各种网络服务的需求。Nginx中的变量分为两类:自定义变量和内置预定义变量。 **自定义变量** 是用户根据实际需求创建的变量。它们...

    Nginx内置变量列表

    nginx内置变量列表,根据 Nginx 源码文件 ngx_http_variables.c 提取了nginx 的内置变量。

    nginx 内置变量详解及隔离进行简单的拦截

    1,nginx内置变量 nginx 有很多内置变量可以进行简单的过滤。 $arg_name 请求行中的name参数。 $args 请求行中参数字符串。 $cookie_name 名为name的cookie。 与$uri相同。 $http_name 任意请求头的值;变量名的后...

    NGINX conf 配置文件中的变量大全

    在深入探讨NGINX配置文件中的变量之前,我们先简要了解一下NGINX。NGINX是一款高性能的HTTP和反向代理服务器,广泛应用于互联网上处理高并发连接、静态文件服务以及负载均衡等场景。其配置文件是实现NGINX功能的核心...

    agentzh 的 Nginx 教程(版本 2016.07.21)整理成pdf 添加书签

    - **系列内容**:该系列共包含八篇文章,深入讨论Nginx中的变量机制及其应用。 - **重要性**:理解Nginx变量对于优化配置和服务性能至关重要。 - **涵盖知识点**: - **变量定义**:介绍了Nginx如何定义变量以及...

    agentzh写的Nginx教程

    12. Nginx变量系列:该系列包含了至少八篇专注于Nginx变量的文章,Nginx变量是Nginx配置中非常重要的一个方面,变量可以用于配置文件中的各种指令里,以实现更灵活的配置。 13. Nginx指令执行顺序系列:该系列文章...

    Nginx教程.pdf

    #### 一、Nginx变量漫谈 1. **变量的概念**:在Nginx中,变量是用来存储特定值的一种机制,这些值可以在配置文件中被引用,以便动态地调整Nginx的行为。变量可以包含来自HTTP请求的信息、服务器状态数据或由Nginx...

    nginx 内置变量表 Excel版.rar

    经常需要配置Nginx ,其中有许多以 $ 开头的变量,经常需要查阅nginx 所支持的变量。 可能是对 Ngixn资源不熟悉,干脆就直接读源码,分析出支持的变量。 Nginx支持的http变量实现在 ngx_http_variables.c 的 ngx_...

    nginx全局变量整理小结

    Nginx 全局变量整理小结 Nginx 全局变量是 Nginx 服务器中的一组预定义变量,用于存储当前请求的信息和服务器的状态。这些变量可以在 Nginx 配置文件中使用,帮助管理员更好地管理和优化服务器。这篇文章将对 Nginx...

    window下nginx配置

    ### Window下Nginx配置详解 #### 一、前言 一直以来,许多开发者都认为Nginx只能在Linux环境下运行,实际上,在Windows系统中同样可以部署并高效运行Nginx。随着网站流量的增长,单台服务器可能无法满足需求,此时...

    史上最牛逼的Nginx最佳实践教程从入门到精通

    1.Nginx安装 2.nginx编译参数相机 3.nginx安装配置+清缓存模块安装 4.nginx连接PHP5.5 5.nginx配置虚拟主机 ...Nginx变量详解 Nginx模块与实践案例 提供了目前所有互联网公司都在用的51个案例 常见问题

    agentzh-nginx-tutorials-en.pdf

    ### Nginx 变量与指令执行顺序教程 #### 前言 本文档由agentzh(章亦春)编写,旨在为不同经验水平的Nginx用户介绍一系列深入的技术文章。作者在过去几年中深入参与了Nginx相关工作,并决定将这些经验和知识通过...

    nginx 的一些配置

    在“Nginx变量漫谈”中,将会探讨Nginx的内置变量以及变量的使用场景,这对于编写高级配置非常有用。 此外,Nginx的if指令虽然在某些情况下可用,但使用不当可能会导致意外的行为。因此,“Nginx的if是邪恶的”这个...

    Nginx 内置预变量都有哪些?

    Nginx 内置预变量都有哪些?

    arm 架构 docker运行nginx镜像包

    arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构 docker运行nginx镜像包,arm 架构...

    agentzh-nginx-tutorials-zhcn.pdf

    #### 一、Nginx变量漫谈 ##### 知识点1:Nginx变量的基础概念 - **定义**:Nginx变量用于表示动态值,可以在配置文件中被引用。 - **作用**:简化配置、增强灵活性。 ##### 知识点2:内置变量与自定义变量 - **...

Global site tag (gtag.js) - Google Analytics