码农日记

薄洪涛的个人博客

Nginx如何获取get/post传递的参数?

有一些业务场景,需要我们用nginx做url的重写,这样的话我们就需要做参数的拼接,比如我们想把xxx.com/a/1/2 重写成yyy.com/b?a=1&b=2,就需要做参数的拼接;

假如我们的url是这样的xxx.com/abc/1/2,我们想获取1,2 这两个参数,在nginx的配置文件中,我们应该这么写

location ~/abc/(.*)/(.*){
       return 200 $1;
}

这样返回的就是1,如果写$2 那么获取的就是第二个参数2,以此类推,运行结果如下:

[root@localhost sbin]# curl 127.0.0.1/abc/1/2
1

假如我们的url是xxx.com/abc?a=1 这种呢,那简单,只要这样写就可以

    location ~/abc{
       return 200 $arg_a;
    }

$arg_后面拼上参数的名字,就可以获取到参数了,运行结果如下

[root@localhost sbin]# curl 127.0.0.1/abc?a=9527
9527

这里是通过nginx的常用变量来获取的参数,其他的常用变量这里也顺道说一下子

举个栗子,我们的请求url是  http://localhost/index.html?a=1&b=2  同时我们指定自定义的header头为  'c:3'

那么,

$url     对应的就是  /index.html

$args  对应的就是  a=1&b=2

$request_url  对应的就是/index.html?a=1&b=2

$arg_a  对应的就是 1

$arg_b  对应的就是 2

$remote_addr 对应的就是127.0.0.1 (获取的是请求者的ip)

$http_c  对应的是 3


那如果是获取post请求的数据呢?

对于这种我们有两种方法,一是post转成get请求,这一点我之前有写过教程,传送门

第二种,用lua去获取,方法如下

location ~/post{
         content_by_lua_block {
                local data = ngx.req.get_body_data()
                ngx.say(data)
            }
     }

然后我们发现,运行结果是这样的

@localhost sbin]# curl  -X POST -d "data=123&key=456"  127.0.0.1/post 
nil

获取的数据为空

究其原因,主要是 Nginx 诞生之初主要是为了解决负载均衡情况,而这种情况,是不需要读取 body 就可以决定负载策略的,所以这个点对于 API Server 和 Web Application 开发的同学有点怪

我们只需要在location加上下面这句话就可以了

lua_need_request_body on;

运行结果如下

[root@localhost sbin]# curl  -X POST -d "data=123&key=456"  127.0.0.1/post 
data=123&key=456

以上就是nginx对get和post参数的获取

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处