阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

简单介绍nginx 变量使用

70次阅读
没有评论

共计 1931 个字符,预计需要花费 5 分钟才能阅读完成。

Nginx 同 Apache 和 Lighttpd 等其他 Web 服务器的配置记法不太相同,Nginx 的配置文件使用语法的就是一门微型的编程语言。可以类似写程序一般编写配置文件,可操作性很大。既然是编程语言,一般也就少不了“变量”这种东西。

nginx 变量简介

所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上 $ 前缀
在 Nginx 配置中,变量只能存放一种类型的值,有且也只存在一种类型,那就是字符串类型

创建变量与赋值

使用了标准 ngx_rewrite 模块的 set 配置指令对变量 $a 进行了赋值操作

set $hello "hello world";
Perl 的变量插值

这里使用变量方法,直接写在双引号内,perl 将检查引号内的每个字符,看看是否有特殊定义,然后将它替换为其内容,这叫做变量插值
写在单引号内会则是原文不会改变
当然有些语法中不加算引号,直接写内容也是可以的

set $hello "hello world";
print "this is $hello  .";
大括号插值

在“变量插值”的上下文中,还有一种特殊情况,即当引用的变量名之后紧跟着变量名的构成字符时(比如后跟字母、数字以及下划线),我们就需要使用特别的记法(${变量名})来消除歧义

set $hello "hello";
print "this is ${hello}World .";
输出 $ 符

在 nginx 中 $ 字符给转义是不支持的,但我们可以通过不支持“变量插值”的模块配置指令专门构造出取值为 $ 的 Nginx 变量,然后再在 echo 中使用这个变量。
这里用到了标准模块 ngx_geo 提供的配置指令 geo 来为变量 $dollar 赋予字符串 $,这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar 变量就可以了

geo $dollar {default "$";}

server {
    listen 8080;

    location /test {echo "This is a dollar sign: $dollar";}
}
变量创建,赋值及作用域问题

变量的创建和赋值操作发生在全然不同的时间阶段。Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。
例:

set $hello "hello";
print "this is ${hello}World .";

如 set 指令中,nginx 启动后是存在变量 $hello 的,但是只有真正运行到该地方时,变量才赋值了

Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块
Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰
例:

server {
       listen 8080;

       location /foo {echo "foo = [$foo]";
       }

       location /bar {
           set $foo 32;
           echo "foo = [$foo]";
       }
   }

结果:

$ curl 'http://localhost:8080/foo'
    foo = []
 
    $ curl 'http://localhost:8080/bar'
    foo = [32]
 
    $ curl 'http://localhost:8080/foo'
    foo = []

从这个例子我们可以看到,set 指令因为是在 location /bar 中使用的,所以赋值操作只会在访问 /bar 的请求中执行。而请求 /foo 接口时,我们总是得到空的 $foo 值,因为用户变量未赋值就输出的话,得到的便是空字符串。

Nginx 变量值容器的生命期是与当前正在处理的请求绑定的,而与 location 无关。
有一种方式叫内部跳转,意思是在处理请求的过程中,于服务器内部,从一个 location 跳转到另一个 location 的过程,这时候这些 location 是共用一套 Nginx 量的容器副本的
例:

server {
        listen 8080;
 
        location /foo {
            set $a hello;
            echo_exec /bar;
        }
 
        location /bar {echo "a = [$a]";
        }
    }

结果

$ curl localhost:8080/foo
a = [hello]

 $ curl localhost:8080/bar
a = []

这时候如果访问 localhost:8080/foo,就会跳转到/bar,输出结果a = [hello],但是如果直接访问localhost:8080/bar, 输出结果则为a = [],因为$a 变量没有赋值

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1931字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中