nginx变量学习总结

参考网址:
http://www.ttlsa.com/nginx/nginx-tutorial-from-entry-to-the-master-ttlsa/

  • nginx变量的创建在加载或启动时进行

  • nginx变量的赋值在请求处理时发生

  • 每个请求都有独立的变量存放容器副本,主请求以及各个子请求之间的值容器副本互不影响

  • 请求在处理中,通过内部跳转经过多个location块,使用的还是同一套变量容器副本

  • rewrite ^和echo_exec可发起内部跳转nginx变量的生命周期与当前正处理的请求绑定,与location无关

  • 常用的内建变量:

    $uri 当前请求的 URI(经过解码,并且不含请求参数)
    $request_uri 获取请求最原始的 URI (未经解码,并且包含请求参数)
    $arg 在读取时返回当前请求的 URI参数串(即请求 URL 中问号后面的部分)
    $arg_XXX 变量群 当前请求名为 XXX的 URI 参数值,而且是未解码的原始形式值
    $cookie_XXX 变量群 获取cookie值
    $http_XXX变量群 获取请求头
    $sent_http_XXX 变量群 获取响应头

  • 对内建变量的修改会直接导致当前请求的 URL 参数串发生变化,影响到所有部分的功能

  • 类似 a r g X X X 、 arg_XXX、 argXXXcookie_XXX等变量群属于未索引变量,Nginx 不会事先解析好 URI参数串,而是在用户读取某个 $arg_XXX 变量时,调用其取处理程序,即时去扫描 URI参数串。

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

  • map模块、geo 等模块使用了变量值缓存机制,在设置了取处理程序的情况下,多次读取变量的时候,只需要调用取处理程序计算一次。

  • map 模块会自动将因变量($foo)的计算结果缓存下来,在当前请求的处理过程中如果再次读取这个因变量,Nginx 就可以直接返回缓存住的结果,不再调用该变量的“取处理程序”再行计算了。另外,map 指令在 server 配置块之外,也就是在最外围的 http 配置块中定义,全局范围的 map 设置并不会让访问所有虚拟主机的所有 location 接口的请求都执行一遍变量值的映射计算,只有在读取用户变量时,在取处理程序中进行映射计算。(只在实际使用对象时才计算对象值的技术,在计算领域被称为“惰性求值”(lazy evaluation)
    在这里插入图片描述

    default 是一个特殊的匹配条件,即:
    当其他条件都不匹配的时候,匹default,$foo 映射到值 0
    a r g s 的 值 等 于 d e b u g 的 时 候 , args 的值等于 debug 的时候, argsdebugfoo 映射到值 1
    在这里插入图片描述
    在这里插入图片描述

  • nginx请求分为主请求和子请求,主请求指由HTTP 客户端从 Nginx 外部发起的请求(包括echo_exec发起的内部跳转),子请求指由 Nginx 正在处理的请求在 Nginx 内部发起的一种级联请求。子请求是Nginx 内部的一种抽象调用,目的是为了方便用户把“主请求”的任务分解为多个小粒度的“内部请求”,并发或串行地访问多个 location 接口,然后由这些 location 接口通力协作,共同完成整个“主请求”

  • echo_location 指令可以发起到不同location接口的GET 类型的"子请求”,父子请求变量容器互不影响,禁用父子请求间的变量共享

  • 容易出错的是,auth_request 指令发起的请求,会在父子之间共享一套 Nginx 变量容器,因为 auth_request 指令会自动忽略“子请求”的响应体,只检查“子请求”的响应状态码。当状态码是 2XX 的时候,auth_request 指令会忽略“子请求”而让 Nginx 继续处理当前的请求,否则它就会立即中断当前(主)请求的执行,返回相应的出错页。
    在这里插入图片描述
    在这里插入图片描述

  • a r g 、 arg、 arguri等内建变量在子请求中时,取处理程序也会正确返回当前子请求解析出的参数值;但少数内建变量只作用于主请求,如$request_method(返回get、post)等

  • 利用lua模块区分变量不存在、变量为空
    在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值