nginx http变量定义
struct ngx_http_variable_s {
ngx_str_t name; //变量名
ngx_http_set_variable_pt set_handler; //设置变量函数
ngx_http_get_variable_pt get_handler; //获取变量函数
uintptr_t data; //变量中的数据
ngx_uint_t flags; //变量标志
ngx_uint_t index; //变量索引值
}
正则变量
typedef struct {
ngx_uint_t capture;
ngx_int_t index;
} ngx_http_regex_variable_t
typedef struct {
ngx_regex_t *regex; //正则表达式
ngx_uint_t ncaptures; //俘获的正则变量数量
ngx_http_regex_variable_t *variables; //正则变量表
ngx_uint_t nvariables; //正则变量数量
ngx_str_t name; //正则变量名
} ngx_http_regex_t
typedef struct {
ngx_http_regex_t *regex; //正则表达式
void *value; //正则值
} ngx_http_map_regex_t
正则字典
typedef struct {
ngx_hash_combined_t hash; //hash表
#if (NGX_PCRE)
ngx_http_map_regex_t *regex; //正则表
ngx_uint_t nregex; //元素数量
#endif
} ngx_http_map_t
变量值定义
typedef struct {
unsigned len:28; //变量的长度
unsigned valid:1; //valid 表示变量是否有效的标记
unsigned no_cacheable:1; //表示变量可否缓存
unsigned not_found:1; //表示没找到变量的值
unsigned escape:1; //变量中是否有空格
u_char *data; //变量数据
} ngx_variable_value_t
nginx变量类型
NGX_HTTP_VAR_CHANGEABLE //可变变量
NGX_HTTP_VAR_NOCACHEABLE //不可变变量
NGX_HTTP_VAR_INDEXED
NGX_HTTP_VAR_NOHASH
NGX_HTTP_VAR_PREFIX
nginx http变量原理及使用
1.添加http变量(普通变量)
ngx_http_variable_t *
ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)
{
...
if (name->len == 0) {
/*变量名为空,认定无效同时返回错误*/
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"invalid variable name \"$\"");
return NULL;
}
if (flags & NGX_HTTP_VAR_PREFIX) {
/*flags为前缀标记 加入到前缀变量中*/
return ngx_http_add_prefix_variable(cf, name, flags);
}
/*获取main作用域的配置*/
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
/*main作用域配置的变量表*/
key = cmcf->variables_keys->keys.elts;
for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {
if (name->len != key[i].key.len
|| ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)
{ /*不在main作用域的变量表中*/
continue;
}
/*获取变量的key值*/
v = key[i].value;
if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {
/*变量带有changeable标记 判定变量出现了重复 随即返回空值*/
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"the duplicate \"%V\" variable", name);
return NULL;
}
/*清除掉flags中的weak标记*/
v->flags &= flags | ~NGX_HTTP_VAR_WEAK;
return v;
}
/*分配变量内存*/
v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));
if (v == NULL) {
/*可用内存不足 返回空值*/
return NULL;
}
/*拷贝变量名*