在nginx lua中检查请求方法的正确方法

时间:2015-02-25 13:55:31

标签: nginx lua

我正在尝试使用nginx和lua编写REST接口。我想知道的是,检查请求方法的最佳方法是什么?如果它是GET,我需要查询数据库。如果它是POST或DELETE,我需要运行另一个lua脚本来更新数据库。 到目前为止,这是我的代码看起来像测试请求方法的内容:

    #curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000' -H "Accept:application/json"
    location /widgets/widget {
            default_type "text/pain";
            #ifisEvil... unless done inside lua
            content_by_lua '
                    ngx.say("request is:",ngx.var.request_method)
                    ngx.say("the constant is:",ngx.HTTP_GET)
                    --ngx.say("the type is: ", type(ngx.HTTP_GET)

                    if ngx.var.request_method == ngx.HTTP_GET then
                            local args = ngx.req.get_uri_args()
                            for key, val in pairs(args) do
                                    if type(val) == "table" then
                                            ngx.say(key, ": ", table.concat(val, ", "))
                                    else
                                            ngx.say(key, ": ", val)
                                    end
                            end
                    end
            ';

    }

输出如下:

mytestdevbox2:/var/www/nsps2# curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000' -H "Accept:application/json"
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 25 Feb 2015 13:44:11 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive

request is:GET
the constant is:2
mytestdevbox2:/var/www/nsps2# 

以上输出解释了if语句失败的原因......因为我正在比较" GET"如果它们已经可用并且我在这里遗漏了一些东西,我宁愿不编制自己的常量列表。

我知道有一个名为" $ request_method"的nginx变量。但我宁愿不使用它,因为我想把我的所有逻辑保留在lua中。从我到目前为止所读到的,使用" if" nginx中的语句是evil
所以我试图坚持使用lua代码来做类似的事情。

关于我可能搞砸了我的lua代码的任何提示?

1 个答案:

答案 0 :(得分:1)

Lua的方法常量,例如ngx.HTTP_GET,根据他们的文档mainly for ngx.location* calls

所以没有"更好"在Lua中检查方法的方法,而不是将其与GET和方法字符串的其余部分进行比较。


但是我会认真考虑使用"evil" if根据nginx级别的方法拆分您的请求。

这使您可以根据方法配置单独的日志记录,错误处理等。