3.14
这样的数值,也可以是 hello world
这样的字符串,甚至可以是像数组、哈希表这样的复杂数据结构。然而,在 Nginx
配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串。nginx.conf
文件中有下面这一行配置:我们使用了标准 ngx_rewrite 模块的 set 配置指令对变量
$a
进行了赋值操作。特别地,我们把字符串 hello world
赋给了它。3.14
这样的数值,也可以是 hello world
这样的字符串,甚至可以是像数组、哈希表这样的复杂数据结构。然而,在 Nginx
配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串。nginx.conf
文件中有下面这一行配置:$a
进行了赋值操作。特别地,我们把字符串 hello world
赋给了它。$
符号,这是记法上的要求。所有的 Nginx
变量在 Nginx 配置文件中引用时都须带上 $
前缀。这种表示方法和 Perl、PHP
这些语言是相似的。$
这样的变量前缀修饰会让正统的 Java
和 C#
程序员不舒服,但这种表示方法的好处也是显而易见的,那就是可以直接把变量嵌入到字符串常量中以构造出新的字符串:$a
的值,来构造变量 $b
的值,于是这两条指令顺序执行完之后,$a
的值是 hello
,而
$b
的值则是 hello, hello
. 这种技术在 Perl
世界里被称为“变量插值”(variable
interpolation),它让专门的字符串拼接运算符变得不再那么必要。我们在这里也不妨采用此术语。nginx.conf
配置文件中最外围的 http
配置块以及
events
配置块。使用 curl
这个 HTTP 客户端在命令行上请求这个
/test
接口,我们可以得到$foo
变量的值作为当前请求的响应体输出。$
)的字符串,那么有没有办法把特殊的 $
字符给转义掉呢?答案是否定的(至少到目前最新的 Nginx 稳定版
1.0.10
)。不过幸运的是,我们可以绕过这个限制,比如通过不支持“变量插值”的模块配置指令专门构造出取值为
$
的 Nginx 变量,然后再在 echo 中使用这个变量。看下面这个例子:$dollar
赋予字符串
'$'
,这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar
变量就可以了。其实 ngx_geo 模块最常规的用法是根据客户端的 IP 地址对指定的 Nginx
变量进行赋值,这里只是借用它以便“无条件地”对我们的 $dollar
变量赋予“美元符”这个值。