搜尋

首頁  >  問答  >  主體

luajit - nginx+lua取得POST參數問題

各位大神,我有個需求就是需要判斷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參數的值都是正確的。

現在不知道問題出在哪裡了?求大神告知。感激。 。 。

黄舟黄舟2751 天前1124

全部回覆(3)我來回復

  • 为情所困

    为情所困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 the conluaable of text_
    stack traceback: [C]: in function 'read_body' set_by_lua:6: in function );
    但是你可以使用rewrite_by_lua,如:
    location / {

    但是你可以使用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,可能是關鍵字與系統變數有衝​​突。 🎜

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 17:18:40

    樓主請教一下。不知道為什麼我的ngx.req.get_post_args()一直取得不到值,但ngx.req.get_body_data()可以。可能是什麼原因呢?

    回覆
    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(),或開啟強制執行檔(「管理」物件此方法不推薦)

    回覆
    0
  • 取消回覆