详细原文查看这里:http://blog.sina.com.cn/s/blog_6d579ff40100wk2j.html另一篇归纳原文的文章看这里:http://blog.csdn.net/yankai0219/article/details/8070790
变量插值:
所有的Nginx变量在Nginx配置文件中引用时都须带上$前缀,用$符号+变量名来构造新的变量,这种方式叫做变量插值。
例如:
Nginx在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载location test{set $a hello;set $b "$a ,world";echo "b: $b";}
访问:
curl http://localhost/test/
输出:
b: hello world说明:上述set是HttpRewriteModule的指令,而echo是HttpEchoModule指令。可见这两个模块都支持变量插值。
但是并不是所有模块都支持变量插值,事实上,指令参数是否允许“变量插值”
,取决于该指令的实现模块。
变
量使用注意点:
当变量后面直接接其他字符串时,需要用{}将变量名括起来,否则会将变量名和后面的字符串连在一起当成一个变量名
例如:
location /test {set $variable "hello";echo"${variable}world";}变量必须先创建再使用,否则报错
例如:
server {listen 80;
location /test{echo $foo;}}
访问:
curl http://localhost/test/
报错:
[emerg] unknown"foo" variable
说明:
nginxnginx变量的创建和赋值操作发生在全然不同的时间阶段。
Nginx变量的创建只能发生在Nginx配置加载的时候,或者说Nginx启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的Nginx变量
变量的可见性:
Nginx变量一旦创建,其变量名的可见范围就是整个Nginx配置,甚至可以跨越不同虚拟主机的server配置块。
例如:
server {listen 80;location /foo {echo "foo =[$foo]";}location /bar {set $foo 32;echo "foo =[$foo]";}}说明:这里我们在location /bar中用set指令创建了变量$foo,于是在整个配置文件中这个变量都是可见的,因此我们可以在location /foo中直接引用这个变量而不用担心Nginx会报错。
访问这两个接口的结果:
$ curl 'http://localhost/foo'foo = []$ curl 'http://localhost/bar'foo = [32]$ curl 'http://localhost/foo'foo = []从本例子得出另一个变量特性:Nginx变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。
比如前面我们请求了/bar接口后,$foo变量被赋予了值32,但它丝毫不会影响后续对/foo接口的请求所对应的$foo值(它仍然是空的!),因为各个请求都有自己独立的$foo变量的副本对于Nginx新手来说,最常见的错误之一,就是将Nginx变量理解成某种在请求之间全局共享的东西,或者说“全局变量”
。而事实上,Nginx变量的生命期是不可能跨越请求边界的内建变量
常见的内建变量:
$uri:用来获取当前请求的URI(经过解码,并且不包含请求参数)
$request_uri:用来获取请求最原始的URI(未经解码,并且包含请求参数)
location /test {echo "uri = $uri";echo "request_uri =$request_uri";}
请求和响应:
$ curl 'http://localhost:8080/test'uri = /test request_uri = /test$ curl 'http://localhost:8080/test?a=3&b=4'uri = /test request_uri = /test?a=3&b=4$ curl 'http://localhost:8080/test/hello%20world?a=3&b=4'uri = /test/hello world request_uri = /test/hello%20world?a=3&b=4$arg_xxx变量群:用来获取当前请求名为xxx的URI参数的值location /test {echo "name:$arg_name";echo "class:$arg_class";}
请求和响应:
$ curl 'http://localhost:8080/test'name:class:$ curl 'http://localhost:8080/test?name=Tom&class=3'name: Tom class: 3$ curl 'http://localhost:8080/test?name=hello%20world&class=9'name: hello%20world class: 9其实$arg_name不仅可以匹配name参数,也可以匹配NAME参数,抑或是Name,等等,Nginx会在匹配参数名之前,自动把原始请求中的参数名调整为全部小写的形式:$ curl 'http://localhost:8080/test?NAME=Marry'name: Marry class:$ curl 'http://localhost:8080/test?Name=Jimmy'name: Jimmy class:$cookie_xxx变量群:用来获取cookie值$http_xxx变量群:用来获取请求头的值$send_http_xxx变量群:用来获取响应头的值$args:返回当前请求的URL参数串(即请求URL中问号后面的部分)
以上就介绍了nginx 变量,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
