Nginx漫谈学习-Nginx变量

幸运
185
文章
0
评论
三月 18, 202004:57:50 评论 156

变量概念:

  • Nginx 配置中,变量只能存放一种类型的值,那就是字符串
  • 标准ngx_rewrite模块的set方法可进行赋值 如: set $a "Hello World"
  • Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx启动的时候,而赋值操作则只会发生在请求实际处理的时候
  • 不创建而直接使用变量会导致启动失败,无法在请求处理时动态地创建新的 Nginx 变量
  • Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰
  • 一个请求在其处理过程中,即使经历多个不同的 location 配置块,它使用的还是同一套 Nginx 变量的副本

Nginx 内建变量(预定义变量)

ngxhttpcore

  1.  $uri           -- 当前请求的 URI,不含请求参数
  2.  $request_uri   -- 最原始的 URI, 包含请求参数
  3.  $arg_XXX       -- URL参数变量群, 当前请求名为 name 的 URI 参数的值,系统自动小写
  4.  $cookie_XXX    -- COOKIE参数变量群
  5.  $http_XXX      -- HTTP请求头变量群
  6.  $sent_http_XXX -- HTTP响应头变量群
  7.  $args          -- 请求参数串
  • 取处理程序(get handler) : 读取变量时执行的代码
  • 存处理程序(set handler) : 改写变量时执行的代码
  • 不是所有的 Nginx 变量都拥有存放值的容器。拥有值容器的变量在 Nginx 核心中被称为“被索引的”(indexed);反之,则被称为“未索引的”(non-indexed)
  • 变量群一般都是未索引的,即没预先赋值,每次都是要的时候才去扫描解析

* Nginx内建变量大部分不允许修改或重新赋值 *

ngxsetmisc

如果你想对 URI 参数值中的 %XX 这样的编码序列进行解码,可以使用第三方 ngxsetmisc 模块提供的 setunescapeuri 配置指令:

  1.    location /test {
  2.        set_unescape_uri $name $arg_name;
  3.        set_unescape_uri $class $arg_class;
  4.        echo "name: $name";
  5.        echo "class: $class";
  6.    }

ngx_map (映射模块)

  • map 指令是在 server 配置块之外,也就是在最外围的 http 配置块中定义的

  • 解释:

  • 函数记法 y = f(x) 来说, $args 就是“自变量” x,而 $foo 则是“因变量” y

  • $foo 的值是由 $args 的值来决定的,将 $args 变量的值映射到了 $foo 变量上。

  • 完整的映射规则:当 $args 的值等于 debug 的时候,$foo 变量的值就是 1,否则 $foo 的值就为 0.

  1. map $args $foo {
  2.   default 0; #当其他条件都不匹配的时候,这个条件才匹配
  3.   debug   1; #如果“自变量” $args 精确匹配了 debug
  4.              #这个字符串,则把“因变量” $foo 映射到值
  5. }
  6. server {
  7.    listen 8080;
  8.    location /test {
  9.        set $orig_foo $foo;
  10.        set $args debug;
  11.        echo "original foo: $orig_foo";
  12.        echo "foo: $foo";
  13.    }
  14. }
  15. #结果
  16. $ curl 'http://localhost:8080/test'
  17. original foo: 0
  18. foo: 0
  19. # 第一行输出指示 $orig_foo 的值为 0,请求并没有提供 URL 参数串
  20. # $foo 变量在第一次读取时,根据映射规则计算出的值被缓存住了,

Nginx变量的值两种特殊的值

  • 一种是“不合法”(invalid),另一种是“没找到”(not found)。

  • 由 set 指令创建的变量未初始化就用在“变量插值”中时,效果等同于空字符串,但那是因为 set 指令为它创建的变量自动注册了一个“取处理程序”,将“不合法”的变量值转换为空字符串

  • 内建变量 $argXXX 在请求 URL 参数 XXX 并不存在时会返回特殊值“找不到”,但遗憾的是在 Nginx 原生配置语言中是不能很方便地把它和空字符串区分开来的, 只有通过第三方模块 ngxlua

  1. location /test {
  2.    content_by_lua '
  3.        if ngx.var.arg_name == nil then
  4.            ngx.say("name: missing")
  5.        else
  6.            ngx.say("name: [", ngx.var.arg_name, "]")
  7.        end
  8.    ';
  9. }
  10. # ngx.say 这个 Lua 函数,也是 ngx_lua 模块提供的,功能上等价于 ngx_echo 模块的 echo 配置指令
  11. #结果
  12. $ curl 'http://localhost:8080/test'
  13. name: missing
  14. $ curl 'http://localhost:8080/test?name='
  15. name: []
  1. location /foo {
  2.    content_by_lua '
  3.        if ngx.var.foo == nil then
  4.            ngx.say("$foo is nil")
  5.        else
  6.            ngx.say("$foo = [", ngx.var.foo, "]")
  7.        end
  8.    ';
  9. }
  10. location /bar {
  11.    set $foo 32;
  12.    echo "foo = [$foo]";
  13. }
  14. #结果
  15. $ curl 'http://localhost:8080/foo'
  16. $foo = []
  17. #因为nginx在启动阶段已经给$foo初始化了,只是没赋值,赋值发生在调用阶段的容器副本

Nginx 变量也能存放数组类型的值

这种类型的复杂任务通过 ngxlua 实现 ``` location /test { arraysplit "," $argnames to=$array; arraymap "[$arrayit]" $array; arrayjoin " " $array to=$res;

  1. echo $res;

} ```

本文来源于:Nginx漫谈学习-Nginx变量-幸运草博客
特别声明:以上文章内容仅代表作者本人观点,不代表幸运草博客观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与幸运草联系。

  • 本站QQ群
  • weinxin
  • 捐赠本站
  • weinxin
Nginx手把手安装 Nginx

Nginx手把手安装

Netcraft 发布了2018年1月 Web 服务器调查报告,排名前三的依然是 Microsoft、Apache 和 nginx 。 Nginx为什么值得学习呢?可以看这篇文章 → Nginx的优点...
nginx实例 - 如何防止大图片占满带宽? Nginx

nginx实例 – 如何防止大图片占满带宽?

场景 前几天网站出现了访问缓慢的情况,查看系统资源状况后,发现出网带宽一直是占满的状态 查看服务器日志,发现了很多10M左右的超大图片的请求,这些图片占满了带宽,严重影响了其他的访问请求 正常情况下是...
Nginx网站服务 Nginx

Nginx网站服务

1、Nginx:(优点) (1)高性能、轻量级web服务软件 (2)稳定性高 (3)系统资源消耗低 (4)对http并发连接的处理能力强 2、apache和nginx的区别: Apache:是多进程w...
nginx配置二级域名 Nginx

nginx配置二级域名

主机域名配置那些事 server_name 匹配顺序 nginx中的server_name是用于指定基于名称的虚拟主机,匹配顺序是在配置文件中检索,从上到下,一匹配到符合的则终止,所以配置得按照精准在...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: