nginx的指令开发时变量处理二
来源:互联网 发布:以色列 科技 知乎 编辑:程序博客网 时间:2024/06/06 05:13
前言
上一博
nginx指令开发时变量处理一
介绍了一种指令中出现变量的处理方法,今天再介绍一种方法。
步骤
假设命令如下:
my_test_var $arg_channel
意思是:通过url的请求参数中channel来确定做某件事。
模块名为:ngx_http_my_test_var_module
1. 配置结构体如下
typedef struct { ngx_array_t *values; ngx_array_t *lengths;} ngx_http_test_var_conf_t;
2 ngx_command_t 定义
{ ngx_string("my_test_var"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_http_my_test_var_handler, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL },
3 ngx_http_my_test_var_handler函数实现如下
static char *ngx_http_my_test_var_handler(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){ ngx_http_test_var_conf_t *tvcf = conf; ngx_str_t *value; ngx_array_t *lengths, *values; ngx_http_script_compile_t sc; if (tvcf->lengths != NGX_CONF_UNSET_PTR) { return "is duplicate"; } ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); lengths = NULL; values = NULL; value = cf->args->elts; sc.cf = cf; sc.source = &value[1]; sc.lengths = &lengths; sc.values = &values; sc.complete_lengths = 1; sc.complete_values = 1; if (ngx_http_script_compile(&sc) != NGX_OK) { return NGX_CONF_ERROR; } tvcf->lengths = lengths->elts; tvcf->values = values->elts; return NGX_CONF_OK;}
4 需要说明一点:在init时,需要设置如下初值
tvcf->lengths = NGX_CONF_UNSET_PTRtvcf->values = NGX_CONF_UNSET_PTR
5 在filter或者在需要用到变量的时候
ngx_http_test_var_conf_t *tvcf = ngx_http_get_module_loc_conf(r, ngx_http_my_test_var_module); ngx_str_t val; /*获取到的值已经存放在字符串val中*/ if (ngx_http_script_run(r, &val, tvcf->lengths, 0, tvcf->values) == NULL) { return NGX_ERROR; } ngx_log_error(NGX_LOG_ERR, r->log, 0, "[test var value]%V", &val);
结束语
当然变量还有很多更高级的用法,比如条件表达式,但是有了以上两种方式处理变量,再加上对于指令中常量的处理,写一般的nginx module就容易了。更深入的用法后续再续
0 0
- nginx的指令开发时变量处理二
- nginx指令开发时变量处理一
- nginx的变量和配置指令
- Nginx的location匹配指令及常用内置变量
- 再谈nginx变量(二)
- nginx由ngx_http_gzip_module模块处理的9个指令
- Nginx 的 default_server 指令
- nginx的root 指令
- Nginx的ip_hash指令
- nginx的root 指令
- nginx的rewrite 指令
- nginx的操作指令
- nginx的root 指令
- nginx的root 指令
- nginx中事件模型中instance变量的处理细节
- nginx中事件模型中instance变量的处理细节
- Nginx 变量漫谈(二)
- Nginx 模块自主开发二:Nginx的类型命名封装
- POJ2823(单调队列初步)
- 157.n1-模仿微信下边点击不同的模块切换不同的界面
- 通俗易懂的 android framework
- Hibernate级联一对一
- xml中直接读取properties键值的解决方式
- nginx的指令开发时变量处理二
- 226. Invert Binary Tree -- 二叉树、递归、交换、栈
- pageController 页面跳转
- Maximum Subarray 解题报告
- 商品管理service和controller
- [Leetcode] Path Sum I,II,III
- 线性方程组 精确解 近似解 算法整理
- 虚拟存储器
- Lab 3