Nginx变量

Nginx与变量

最近学习openresty,发现nginx的变量没有那么简单,仔细搜索了一下,发现果然是这样。Nginx有这么几个特点:

  1. Nginx的处理分为很多阶段,其中变量的赋值和变量的计算是两个阶段。

  2. Nginx的变量生命周期是不与location配置绑定的,即便时使用echo_exec配置指令,发起到另一个location的跳转,上一个location的变量仍旧有效。因为这是同一套Nginx变量副本。

  3. Nginx提供$uri(经过解码、不含参数)和$request_uri(不经解码、含参数)

  4. 在设置了“取处理程序”的情况下,Nginx变量可以选择将值缓存,这样多次读取数值只需要调用一次“取处理程序”

    1. ngx_map模块的map指令就是一种值缓存,它只计算一次。
    2. map指令定义一种映射关系,查看$args变量中是否精确匹配的其中的某一项。
    3. map指令是在server配置块之外定义的,但不必担心每次请求都会调用map,因为map只有在用到它的值的时候才会计算,且仅计算一次。
  5. 我们已经了解了变量的值容器的生命周期是和请求绑定的,但Nginx请求分为两种,主请求和子请求。通过ngx_echoecho_location模块可以发起对其它location的GET请求。

    1. 父子请求之间,同名变量一般不会相互干扰。
    2. ngx_auth_request这个模块却默认共享父请求的变量容器。
    3. 共享变量容器会产生一些诡异的bug,绝大多数模块默认禁止。
  6. Nginx内建变量在“子请求”上下文中的行为

    1. 对于$args$args_xxx$uri`等内建变量的行为是符合我们的直觉的,父子请求都是独立的。
    2. 对于ngx_http_core模块中的$request_mothod却总是读到“主请求的的方法。
    3. 对此我们只能使用第三方的模块ngx_echo提供的变量$echo_request_method来获取子请求的方法。
  7. Nginx内建变量无法区分参数不合法和