ngx_http_arg ()可以分析url中的参数(key=value ),
/*请求包含GET /download/nginx-1.9.2.rar? ST=xhwl 03 hbtjrojpeafid6mwe=1452139931 http/1.1的ST和e形成变量$arg_st $arg_e、value分别为
xhwl 03 hbtjrojpeafid6MW 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-1个原因来查看实现
if(p==null )//如果字符串不存在
return NGX_DECLINED;
}
if () p==r-args.data|*(p-1 )==' ' ) ) plen )=='=
value-data=p len 1; //value的data,1是等号的存在
p=ngx_strlchr(p,last,''); //符号出现的位置
if(p==null ) {
p=r-args.data r-args.len;
}
值len=p-value-data;//值的长度
return NGX_OK;
}
}
return NGX_DECLINED;
}
------------- -请参阅
/*
* ngx _ strlcasestrn (isintendedtosearchforstaticsubstring
* withknownlengthinstringuntiltheargumentlast.theargumentn
* mustbelengthofthesecondsubstring-1。
*/
/*ngx_strlcasestrn ()的目的是找出已知长度的固定子字符串,指导参数last,参数n的长度必须是第二个字符串减去1
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 ) {
返回空值;
}
C1=(ngx_uint_t ) *s1;
C1=(C1='a'C1='z '? (c1 |0x20 ) : c1;
(while ) C1!=c2 );
}while(ngx_strncasecmp(S1,s2,n )!=0;
返回--S1;
}
------------- -请参阅
//在字符串s中查找第一个出现的字符c的位置
#definengx_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(Plast ) {
if(*p==c ) {
返回p;
}
p;
}
返回空值;
}
最后,列举离子
例如,请求是https://1.1.1.1/url吗? username=abcpassword=123456
分析的时候可以
ngx _ str _ targ _ username=ngx _ string (' username );
ngx _ str _ t username=ngx _ null _ string;
ngx _ str _ targ _ password=ngx _ string (' password ' );
ngx _ str _ t password=ngx _ null _ string;
/*用户名称* /
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;
}
/*密码* /
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;
/*用户名称* /
if(ngx_ok==ngx_http_arg(r,(u_char* )“用户名称”,8,用户名称”) {。
}
/*密码* /
if(ngx_ok==ngx_http_arg(r,) (u_char* ) ' password ',8,password ) ) }{。
}