求助:nginx模块中取url中的参数

大漠孤舟 2012-07-06 04:58:10
请教:怎么在nginx模块的处理函数handler中取得url中的参数(多个)。
例如:http://192.168.0.10:8100/getparameter?key=123&name=jim&age=15
在handler中用三个字符串变量strKey,strName, strAge分别取得三个参数值123,jim,15?

补充说明:
1、通过r->args.data得到的是“key=123&name=jim&age=15 HTTP/1.1 ...”,还要自己解析,且参数顺序不能变(变的逻辑有些复杂)
2、通过ngx_http_get_indexed_variable获取,得到key=123jim15(错误)
...全文
6794 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舍我其谁婕 2014-02-10
  • 打赏
  • 举报
回复
那如果是POST形式的应该怎么获取呢?
cl165 2013-06-05
  • 打赏
  • 举报
回复
不用自己写,arg_*,*代表URL参数的名称
shh1113 2012-12-04
  • 打赏
  • 举报
回复
留下个qq,咱们好好讨论下呗~1013985969--珍惜(网名)
大漠孤舟 2012-11-26
  • 打赏
  • 举报
回复
再提供个好的nginx源码查询网站 http://lxr.evanmiller.org/http/source/core/ngx_string.h#L36 有遇到困难的同学多交流啊,我也是菜鸟,大家多讨论交流下~
大漠孤舟 2012-11-26
  • 打赏
  • 举报
回复
这个问题解决了,两个方法: 1:自己解析url串,很简单了,用‘&’和‘空格’来分隔,解析。 2、用nginx的提供的参数解析函数

//先定义变量
static ngx_int_t keywordIndex;
static ngx_str_t keywordFlg = ngx_string("keyword");
ngx_http_variable_value_t *keyword_vv;

//定义增加变量函数
static ngx_int_t
ngx_http_suggest_variable_not_found(ngx_http_request_t *r, ngx_http_variable_value_t*v, uintptr_t data)
{
    v->not_found = 1;
    return NGX_OK;
}

static ngx_int_t
ngx_http_suggest_add_variable(ngx_conf_t *cf, ngx_str_t *name)
{
    ngx_http_variable_t *v;
    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);
    if(v == NULL)
    {
        return NGX_ERROR;
    }
    v->get_handler = ngx_http_suggest_variable_not_found;
    return ngx_http_get_variable_index(cf, name);
}

//添加变量
ngx_int_t
ngx_http_module_init(ngx_conf_t *cf)
{
    printf("called:ngx_http_module_init==>\n");

    if((keywordIndex = ngx_http_suggest_add_variable(cf, &keywordFlg)) == NGX_ERROR)
    {
        return NGX_ERROR;
    }
    。。。
}

//handler中取用变量
static ngx_int_t
ngx_suggest_handler(ngx_http_request_t *r)
{
    printf("called:ngx_suggest_handler\n");
    keyword_vv = ngx_http_get_indexed_variable(r, keywordIndex);
    // 注意:keyword_vv
    // 这个ngx_http_variable_value_t结构中有两个变量,data参数值起始位置,len,值长度。
    // OK了,再用这两个参数去取值。
    /*
       27 typedef struct {
       28     unsigned    len:28;
       29 
       30     unsigned    valid:1;
       31     unsigned    no_cacheable:1;
       32     unsigned    not_found:1;
       33     unsigned    escape:1;
       34 
       35     u_char     *data;
       36 } ngx_variable_value_t;
     */
    。。。
}
buildfail 2012-08-09
  • 打赏
  • 举报
回复
char szArgs[URI_LEN + 1] = {0};
memcpy(szArgs, r->args.data, r->args.len);

就能得到key=123&name=jim&age=15。
写个函数解析字符串,获取你想要的参数值。
xuie0000 2012-07-06
  • 打赏
  • 举报
回复
不懂nginx模块, 但可以用strstr(.find())获取指针位置COPY得到结果就行了.

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧