nginx学习琐碎记录

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

一个请求在其处理过程中,即使经历多个不同的 location 配置块,它使用的还是同一套 Nginx 变量的副本

由 ngx_http_core 模块提供的内建变量 $uri,可以用来获取当前请求的 URI(经过解码,并且不含请求参数),而 $request_uri 则用来获取请求最原始的 URI (未经解码,并且包含请求参数)
例如:

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_ 开头的所有变量,我们估且称之为 $arg_XXX 变量群,这个变量的值是当前请求名为 name 的 URI 参数的值,而且还是未解码的原始形式的值。Nginx 会在匹配参数名之前,自动把原始请求中的参数名调整为全部小写的形式。

与面向对象编程中的“存取器”概念相对应,Nginx 变量也是支持绑定“存取处理程序”的。Nginx 模块在创建变量时,可以选择是否为变量分配存放值的容器,以及是否自己提供与读写操作相对应的“存取处理程序”。不是所有的 Nginx 变量都拥有存放值的容器。拥有值容器的变量在 Nginx 核心中被称为“被索引的”(indexed);反之,则被称为“未索引的”(non-indexed)

ngx_map 模块认为变量间的映射计算足够昂贵,为其创建的变量选择使用了值容器,作为其“取处理程序”计算结果的缓存。类似 ngx_map 模块,标准的 ngx_geo 等模块也一样使用了变量值的缓存机制。

只在实际使用对象时才计算对象值的技术,在计算领域被称为“惰性求值”(lazy evaluation),例如 map 指令; set 赋值操作时,会“主动”地计算出变量 $b 的值,而不会将该求值计算延缓到变量 $b 实际被读取的时候,这就是 “主动求值” (eager evaluation)

nginx 变量值容器的生命期是与当前请求相关联的,即 “主请求”以及各个“子请求”都拥有不同的变量值的容器副本。特例:第三方模块 ngx_auth_request,父子请求共享一套 Nginx 变量的行为,虽然这样可以让父子请求之间的数据双向传递变得极为容易,但是会引起未知的bug,很多模块禁用了父子请求间的变量共享

答= auth_request 指令会自动忽略“子请求”的响应体,而只检查“子请求”的响应状态码。当状态码是 2XX 的时候,auth_request 指令会忽略“子请求”而让 Nginx 继续处理当前的请求,否则它就会立即中断当前(主)请求的执行,返回相应的出错页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值