ngx.var.arg與ngx.req.get_uri_args的區別


ngx.var.arg_xx與ngx.req.get_uri_args["xx"]兩者都是為了獲取請求uri中的參數,例如

http://pureage.info?strider=1 

為了獲取輸入參數strider,以下兩種方法都可以:

  1. local strider = ngx.var.arg_strider

  2. local strider = ngx.req.get_uri_args["strider"]

差別在於,當請求uri中有多個同名參數時,ngx.var.arg_xx的做法是取第一個出現的值,ngx.req_get_uri_args["xx"]的做法是返回一個table,該table里存放了該參數的所有值,例如,當請求uri為:

http://pureage.info?strider=1&strider=2&strider=3&strider=4 

時,ngx.var.arg_strider的值為"1",而ngx.req.get_uri_args["strider"]的值為table ["1", "2", "3", "4"]。因此,ngx.req.get_uri_args屬於ngx.var.arg_的增強。

ngx.var.arg_的實現是直接使用nginx原生的變量支持,nginx相關代碼為:

ngx_http_variable_value_t * ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key) { ....(略).... if (ngx_strncmp(name->data, "arg_", 4) == 0) { if (ngx_http_variable_argument(r, vv, (uintptr_t) name) == NGX_OK) { return vv; } return NULL; } vv->not_found = 1; return vv; } static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { ngx_str_t *name = (ngx_str_t *) data; u_char *arg; size_t len; ngx_str_t value; len = name->len - (sizeof("arg_") - 1); arg = name->data + sizeof("arg_") - 1; if (ngx_http_arg(r, arg, len, &value) != NGX_OK) { v->not_found = 1; return NGX_OK; } v->data = value.data; v->len = value.len; v->valid = 1; v->no_cacheable = 0; v->not_found = 0; return NGX_OK; } ngx_int_t ngx_http_arg(ngx_http_request_t *r, u_char *name, size_t len, ngx_str_t *value) { u_char *p, *last; if (r->args.len == 0) { return NGX_DECLINED; } p = r->args.data; last = p + r->args.len; for ( /* void */ ; p < last; p++) { /* we need '=' after name, so drop one char from last */ p = ngx_strlcasestrn(p, last - 1, name, len - 1); if (p == NULL) { return NGX_DECLINED; } if ((p == r->args.data || *(p - 1) == '&') && *(p + len) == '=') { value->data = p + len + 1; p = ngx_strlchr(p, last, '&'); if (p == NULL) { p = r->args.data + r->args.len; } value->len = p - value->data; return NGX_OK; } } return NGX_DECLINED; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM