nginx 变量机制--脚本引擎_ngx_http_script_variables_count-CSDN博客
之前写了一篇有关nginx变量机制的文章,后来发现前一篇文章大部分都是代码的逻辑,理解起来不够通透,最近又抽时间将代码重新梳理了一番,画了几个图帮助理解。希望对正在学习nginx源码的童鞋有一定的帮助,有任何疑问可随时沟通!
变量分类
首先介绍一下nginx变量的分类,在nginx内部有大概三种类型的变量:
1.前缀变量,保存在cmcf->prefix_variables数组中,例如,http_xx(获取请求header) sent_http_xx(获取响应header)等;
2.内置变量,在所有ngx_http_module_t类型的模块中,调用preconfiguration函数添加的变量,保存在cmcf->variables_keys数组中;
3.set类型的自定义变量,在conf文件中通过set指令设置的变量,最后保存到cmcf->variables数组中(对于值域为内置变量也需要在该数组中保存一下----后续会解释到)
![](https://i-blog.csdnimg.cn/blog_migrate/cbc68c252527ea3c3de10933b86ab3a2.png)
自定义变量值域
对于set $name $host$uri来说,值域是$host$uri。值域目前分为两种情况:
1.简单的将值域设置为一个固定的字符串
2.将值域设置为变量+字符串
简单值域:将固定字符串最终保存到rlcf->codes下
复杂值域:将变量及固定字符串都保存到rlcf->codes下(用法马上会有说明)
![](https://i-blog.csdnimg.cn/blog_migrate/a50cccaadea27ce54782f49ba4f0aa1d.png)
变量求值
在调用rewrite模块的回调函数时,会检查rlcf->codes数组下是否有内容,如果有值,就会进行变量求值的动作。
对于简单变量,直接将固定字符串拷贝到r->variables数组中,供后续使用即可。
对于复杂变量,首先遍历codes函数数组:
1.通过自定义变量值域中的回调函数优先计算复杂变量所需要的长度信息,计算完成后,申请内存。
2.通过设置的回调函数将变量的值域保存到申请的内存中(由于值域中的变量是内置变量,所以会直接调用内置变量的回调函数获取真实的value,如:$host的回调函数 --- 解释一中的疑问)
3.将最后的结果保存到r->variables数组中,供后续使用即可
![](https://i-blog.csdnimg.cn/blog_migrate/b89d157b3a4c008a653861d2db4d9698.png)
变量使用
由于每个请求都会存在一个Request结构体,顾每个请求下的variables数组都是单独的,在Rewrite阶段已经将该数组填充完成,后续使用的时候,直接从该数组中获取值即可!