Heim  >  Fragen und Antworten  >  Hauptteil

luajit – Problem mit Nginx+Lua beim Abrufen von POST-Parametern

Lieber Meister, ich muss die Parameter in der URL ermitteln, um den Wert des Dienstparameters zu erhalten. Die URL enthält GET- und POST-Anfragen. Ich habe es mit Nginx+Lua gemacht. Der Code lautet wie folgt:

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

Das Problem besteht nun darin, dass bei einer Anfrage mit GET alles normal ist, aber bei einer Anfrage mit POST meldet Nginx einen 500-Fehler.

Ich verwende den folgenden Code zum Debuggen:

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

Die Werte der in den GET- und POST-Anforderungsmethoden gedruckten Dienstparameter sind korrekt.

Jetzt weiß ich nicht, wo das Problem liegt? Bitte Gott, es mir zu sagen. Dankbarkeit. . .

黄舟黄舟2713 Tage vor1101

Antworte allen(3)Ich werde antworten

  • 为情所困

    为情所困2017-05-16 17:18:40

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

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 17:18:40

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

    Antwort
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-16 17:18:40

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

    Antwort
    0
  • StornierenAntwort