nginx+lua获取POST参数问题

发布于 2022-09-02 19:27:59 字数 1611 浏览 22 评论 0

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

        location / {
                set_by_lua $service '
                        local request_method = ngx.var.request_method
                        if request_method == "GET" then
                                local arg = ngx.req.get_uri_args()["service"] or 0
                                return arg
                        elseif request_method == "POST" then
                                ngx.req.read_body()
                                local arg = ngx.req.get_post_args()["service"] or 0
                                return 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;
        }

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

我用如下的代码调试:

local request_method = ngx.var.request_method
if request_method == "GET" then
        local arg = ngx.req.get_uri_args()["service"] or 0
        ngx.say(arg)
elseif request_method == "POST" then
        ngx.req.read_body()
        local arg = ngx.req.get_post_args()["service"] or 0
        ngx.say(arg)
end

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

尸血腥色 2022-09-09 19:27:59

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;
                }
                

if ($service = 'register') 要比rewrite_by_lua先执行,所以$service根本获取不到内容,不知道有什么解决获取post参数,然后通过参数值判断跳转到不同的upstream,试过用set_form_input $service;也不行,获取不到变量的内容!!!有大神有什么解决方案吗

笑饮青盏花 2022-09-09 19:27:59

解决了,只能说是一个替代方案吧:(proxy_pass的值设置成变量,在rewrite_by_lua模块内条件判断进行赋值)

set $userinfo http://userinfo; 
set $p_pass http://default;  # proxy_pass的值设置成变量, 默认值
  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 ngx.var.service == "register" then
                ngx.var.p_pass = ngx.var.userinfo
            end;
  ';
   proxy_pass $p_pass;

(项目遇到问题刚看两天lua,写的不好,或者大牛有更好的办法记得留言,谢谢)

沙沙粒小 2022-09-09 19:27:59

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

狂之美人 2022-09-09 19:27:59

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

巨坚强 2022-09-09 19:27:59

当你使用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_lua
stack 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,可能是关键字与系统变量有冲突。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文