2017-04-07 53 views
0

假設我正在寫一個聲明一定的指導mymod_opt在定位塊可用的nginx的模塊和用戶編寫類似如下:nginx模塊擴展指令變量的最佳方式是什麼?

location/{ 
    mymod_opt $uri; 
    ... 
} 

什麼是對模塊擴展的變量,使得它得到的最好方式一個ngx_str_t與實際的URI而不是"$uri"

回答

0

看起來最好的方法是將變量作爲腳本處理,當編譯第一次處理配置時使用函數ngx_http_script_compile,當調用模塊來擴展變量時使用ngx_http_script_run。以下是如何設置它的一個示例:

在模塊的本地配置中添加變量以存儲發出的腳本。

struct ngx_http_mymod_loc_conf_t { 
    ngx_array_t* opt_lengths; 
    ngx_array_t* opt_values; 
}; 

在命令數組中指定在遇到指令時運行自定義函數。

static ngx_command_t ngx_http_mymod_commands[] = { 
    { 
    ngx_string("mymod_opt"), 
    NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1, 
    ngx_http_mymod_opt, 
    NGX_HTTP_LOC_CONF_OFFSET, 
    0, 
    NULL 
    }, 
    ... 
} 

添加功能,編譯腳本

static char *ngx_http_mymod_opt(ngx_conf_t *cf, ngx_command_t *command, 
           void *conf) { 
    ngx_http_mymod_loc_conf_t *loc_conf; 
    ngx_str_t *value; 
    ngx_str_t *mymod_opt; 
    ngx_http_script_compile_t script_compile; 

    loc_conf = conf; 
    value = cf->args->elts; 
    mymod_opt = &value[1]; 

    ngx_memzero(&script_compile, sizeof(ngx_http_script_compile_t)); 
    script_compile.cf = cf; 
    script_compile.source = mymod_opt; 
    script_compile.lengths = &loc_conf->mymod_opt_lengths; 
    script_compile.values = &loc_conf->mymod_opt_values; 
    script_compile.variables = ngx_http_script_variables_count(mymod_opt); 
    script_compile.complete_lengths = 1; 
    script_compile.complete_values = 1; 

    if (ngx_http_script_compile(&script_compile) != NGX_OK) return NGX_CONF_ERROR; 

    return NGX_CONF_OK; 
} 

然後變量可以用這個函數調用後擴大:

ngx_str_t result; 
ngx_http_script_run(request, &result, loc_conf->lengths->elts, 0, 
        loc_conf->values->elts) 
相關問題