luajit - nginx+lua获取POST参数问题

浏览:36日期:2022-07-18

问题描述

各位大神,我有个需求就是需要判断url中的参数来获取service参数的值,url有GET和POST请求。我是用nginx+lua做的。代码如下:

location / {set_by_lua $service ’local request_method = ngx.var.request_methodif request_method == 'GET' thenlocal arg = ngx.req.get_uri_args()['service'] or 0return argelseif request_method == 'POST' thenngx.req.read_body()local arg = ngx.req.get_post_args()['service'] or 0return argend;’;if ($service = ’register’){ proxy_pass http://userinfo;}proxy_redirect off;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}

现在的问题是,当我用GET方式请求的时候,一切正常,但是用POST方式请求的时候,Nginx就报500错误。

我用如下的代码调试:

local request_method = ngx.var.request_methodif request_method == 'GET' thenlocal arg = ngx.req.get_uri_args()['service'] or 0ngx.say(arg)elseif request_method == 'POST' thenngx.req.read_body()local arg = ngx.req.get_post_args()['service'] or 0ngx.say(arg)end

GET和POST请求方式打印出来的service参数的值都是正确的。

现在不知道问题出在哪儿了?求大神告知。感激。。。

问题解答

回答1:

当你使用set_by_lua时,如果是POST提交,在调用ngx.req.read_body()时,set_by_lua模块中read_body是被禁止调用的( failed to run set_by_lua: set_by_lua:6: API disabled in the context of set_by_luastack traceback: [C]: in function ’read_body’ set_by_lua:6: in function <set_by_lua:1>);但是你可以使用rewrite_by_lua,如:location / {

set $service ’’; rewrite_by_lua ’ local request_method = ngx.var.request_method if request_method == 'GET' then local arg = ngx.req.get_uri_args()['service'] or 0 ngx.var.service = arg elseif request_method == 'POST' then ngx.req.read_body() local arg = ngx.req.get_post_args()['service'] or 0 ngx.var.service = arg end;’;if ($service = ’register’) { proxy_pass http://userinfo; }proxy_redirect off; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }

希望能够帮到你,另外建议变量名字不要取$service,可能是关键字与系统变量有冲突。

回答2:

楼主请教一下。不知道为什么我的ngx.req.get_post_args()一直获取不到值,但ngx.req.get_body_data()可以。可能是什么原因呢?

回答3:

ngx.req.get_post_args()只能在rewrite_by_lua, access_by_lua, content_by_lua*阶段使用,且在使用前需要先调用ngx.req.read_body(),或打开lua_need_request_body 选项强制本模块读取请求体(此方法不推荐)

相关文章: