nginx变量

简介:

===== Nginx变量 =====

在 Nginx 配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串

1、set指令:标准 ngx_rewrite 模块

   例: set $a "hello world";

   Nginx 变量名前面有一个 $ 符号,这是记法上的要求。所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上 $ 前缀。这种表示方法和 Perl、PHP 这些语言是相似的。

   可以直接把变量嵌入到字符串常量中以构造出新的字符串:这种技术在 Perl 世界里被称为“变量插值”(variable interpolation)

        set $a hello;
        set $b "$a, $a";


2、echo指令:使用第三方 ngx_echo 模块的 echo 配置指令将 $foo 变量的值作为当前请求的响应体输出。

       server {
        listen 8080;

        location /test {
            set $foo hello;
            echo "foo: $foo";
        }
    }

  测试结果如下:

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

   我们看到, echo 配置指令的参数也支持“变量插值”。不过,需要说明的是,并非所有的配置指令都支持“变量插值”。事实上,指令参数是否允许“变量插值”,取决于该指令的实现模块。

3、geo指令:标准模块 ngx_geo 提供的配置指令 geo 来为变量 $dollar 赋予字符串 "$",其实 ngx_geo 模块最常规的用法是根据客户端的 IP 地址对指定的 Nginx 变量进行赋值

     geo $dollar {
        default "$";
    }

 这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar 变量就可以了。

   server {
        listen 8080;

        location /test {
            echo "This is a dollar sign: $dollar";
        }
    }

 

  测试结果如下:

    $ curl 'http://localhost:8080/test'
    This is a dollar sign: $

4、{}分割变量名与后面的字符串

       server {
        listen 8080;

        location /test {
            set $first "hello ";
            echo "${first}world";
        }
    }

  所以如果直接写作 "$firstworld" 则 Nginx “变量插值”计算引擎会将之识别为引用了变量 $firstworld. 为了解决这个难题,Nginx 的字符串记法支持使用花括号在 $ 之后把变量名围起来,比如这里的 ${first}.

测试结果:

  $ curl 'http://localhost:8080/test
    hello world


5、创建变量

      set 指令(以及前面提到的 geo 指令)不仅有赋值的功能,它还有创建 Nginx 变量的副作用,即当作为赋值对象的变量尚不存在时,它会自动创建该变量。

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

 

     

    Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块。我们来看一个例子:

    server {
        listen 8080;

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

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

   这里我们在 location /bar 中用 set 指令创建了变量 $foo,于是在整个配置文件中这个变量都是可见的,因此我们可以在 location /foo 中直接引用这个变量而不用担心 Nginx 会报错。

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

  测试结果:

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


本文转自 Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1958887

相关文章
|
7月前
|
应用服务中间件 nginx
|
12月前
|
应用服务中间件 nginx Python
Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解
Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解
209 0
|
XML JSON 缓存
自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能(二)|学习笔记
快速学习自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能
229 0
自定义变量、Nginx 访问日志转换为 json 及 Nginx gzip 压缩功能(二)|学习笔记
|
应用服务中间件 nginx
Nginx基本配置文件和变量详解
Nginx基本配置文件和变量详解 1. 基本配置文件
|
应用服务中间件 nginx
nginx 通过设置变量来实现多条件且判断
nginx 通过设置变量来实现多条件且判断
598 0
nginx 通过设置变量来实现多条件且判断
Nginx之内嵌变量详解
$arg_name请求行中的name参数 $args请求行中的参数 $binary_remote_addr客户端地址为二进制形式,IPv4地址值的长度是4字节,IPv6地址值的长度是16字节 $body_bytes_sent返回给客户端的字节数,不包括响应头。
761 0
|
缓存 Java 应用服务中间件
顺风详解Nginx系列—Ngx中的变量
在计算机语言中,变量是用来存储和表示数据的,但不同的语言表示变量的方式不同,像java语言会把变量抽象成各种类型,并且每种类型都会用一个特殊的符号表示,比如表示一个整数需要这样:      int age= 25; 用int去声明age是一个变量,并且是一个表示整数的变量。
1196 0
|
缓存 应用服务中间件 nginx
Nginx 变量详解(学习笔记十九)
Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序。当然,是不是“图灵完全的”暂且不论,至少据我观察,它在设计上受 Perl 和 Bourne Shell 这两种语言的影响很大。
1716 0
|
网络协议 应用服务中间件 nginx
|
应用服务中间件 nginx