有一些业务场景,需要我们用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参数的获取