文档章节

ngx_http_arg()函数详解

ustbgaofan
 ustbgaofan
发布于 2016/09/21 18:02
字数 534
阅读 254
收藏 0

ngx_http_arg()可以解析url中的参数(key=value),

/*把请求中GET /download/nginx-1.9.2.rar?st=xhWL03HbtjrojpEAfiD6Mw&e=1452139931 HTTP/1.1的st和e形成变量$arg_st $arg_e,value分别
为xhWL03HbtjrojpEAfiD6Mw 1452139931即$arg_st=xhWL03HbtjrojpEAfiD6Mw,$arg_e=1452139931 */


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) {           //args指向用户请求中的URL参数。没有参数,则返回
        return NGX_DECLINED;
    }

    p = r->args.data;             //p指向参数的第一位置
    last = p + r->args.len;    //last指向参数的最末位置

    for ( /* void */ ; p < last; p++) {       //循环遍历

        /* we need '=' after name, so drop one char from last */

        p = ngx_strlcasestrn(p, last - 1, name, len - 1);//第一,第二个参数是起始指针,第三个参数是要找的字串指针,第四个参数长度,len减一原因可以去看实现

        if (p == NULL) { //如果不存在字串情况
            return NGX_DECLINED;
        }

        if ((p == r->args.data || *(p - 1) == '&') && *(p + len) == '=') {

            value->data = p + len + 1; //value的data ,1是等号的存在

            p = ngx_strlchr(p, last, '&');//&符号出现的位置

            if (p == NULL) {
                p = r->args.data + r->args.len;
            }

            value->len = p - value->data;//value的长度

            return NGX_OK;
        }
    }

    return NGX_DECLINED;
}

--------------------------------------------------------------------------------------------------------------------------

/*
 * ngx_strlcasestrn() is intended to search for static substring
 * with known length in string until the argument last. The argument n
 * must be length of the second substring - 1.
 */

/*ngx_strlcasestrn()目的在于寻找已知长度的固定子串,指导参数last,参数n的长度必须是第二个字串减一

u_char *
ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n)
{
    ngx_uint_t  c1, c2;

    c2 = (ngx_uint_t) *s2++;
    c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;
    last -= n;

    do {
        do {
            if (s1 >= last) {
                return NULL;
            }

            c1 = (ngx_uint_t) *s1++;

            c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;

        } while (c1 != c2);

    } while (ngx_strncasecmp(s1, s2, n) != 0);

    return --s1;

}

------------------------------------------------------------------------------------------------------------------------------------

//查找字符串s中首次出现字符c的位置
#define ngx_strchr(s1, c)   strchr((const char *) s1, (int) c)

static ngx_inline u_char *
ngx_strlchr(u_char *p, u_char *last, u_char c)
{
    while (p < last) {

        if (*p == c) {
            return p;
        }

        p++;
    }

    return NULL;
}

最后,举个离子

比如请求为https://1.1.1.1/url?username=abc&password=123456

解析的时候可以

ngx_str_t arg_username = ngx_string("username");

ngx_str_t username = ngx_null_string;

ngx_str_t arg_password = ngx_string("password");

ngx_str_t password = ngx_null_string;

/*username*/

if(NGX_OK !  = ngx_http_arg(r,arg_username.data,arg_username.len,&username) ){

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,

                                "get arg \"%V\" failed.", &arg_username);

        return NGX_ERROR;

}

/*password*/

if(NGX_OK != ngx_http_arg(r,arg_password.data,arg_password.len,&password)) {

    ngx_log_error(NGX_LOG_ERR,r->connection->log,0,

                                "get arg \"%V\" failed.",& arg_password);

        return NGX_ERROR;

}

--------------------------------

 

也可以直接写

ngx_str_t * username;

ngx_str_t * password;

/*username*/

if(NGX_OK == ngx_http_arg(r,(u_char*)“username",8,username) ){

   。。。。。

}

/*password*/

if(NGX_OK ==  ngx_http_arg(r,(u_char*)"password",8,password)) {

   。。。。。

}

 

 

 

 

© 著作权归作者所有

ustbgaofan
粉丝 15
博文 148
码字总数 38017
作品 0
海淀
程序员
私信 提问
ngx_lua_API 指令详解(一)ngx.timer.at 指令

语法: ok,err = ngx.timer.at(delay,callback,userarg1,userarg2 ...) 上下文: initworkerbylua *,setbylua *,rewritebylua *,accessbylua *,contentbylua *,headerfilterbylua......

tinywan1227
2017/05/04
0
0
【精选】Nginx模块Lua-Nginx-Module学习笔记(二)Lua指令详解(Directives)

源码地址:https://github.com/Tinywan/Lua-Nginx-Redis Nginx与Lua编写脚本的基本构建块是指令。 指令用于指定何时运行用户Lua代码以及如何使用结果。 下面是显示指令执行顺序的图。 当一个...

tinywan1227
2017/03/09
0
0
openresty获取请求参数

获取url参数 ngx.var.argxx与ngx.req.geturi_args["xx"]两者都是为了获取请求uri中的参数,例如 ?strider=1为了获取输入参数strider,以下两种方法都可以: 差别在于,当请求uri中有多个同名...

go4it
2016/12/26
6
0
用lua扩展你的Nginx(写的非常好)

一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器。目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%。Nginx采用模块化的架构,官方版...

污湖洞主
2017/04/19
0
0
【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一、介绍   各种 bylua, byluablock和* byluafile配置指令用作nginx.conf文件中Lua API的网关。 下面描述的Nginx Lua API只能在这...

tinywan1227
2017/03/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rsync工具常用选项以及同步的两种方式

rsync -av /etc/passwd /tmp/1.txt #rsync的本机传输写法 rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt #rsync的远程传输rsync格式rsync [OPTION] … SRC ......

林怡丰
今天
3
0
GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
3
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
5
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
6
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部