在 nginx_lua 中检查请求方法的正确方法

proper way to check for request method in 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" 与 2 进行比较。如果它们已经可用,我宁愿不组成我自己的常量列表并且我只是在这里遗漏了一些东西。

我知道有一个名为“$request_method”的 nginx 变量,但我不想使用它,因为我想将所有逻辑保留在 lua 中。到目前为止,根据我的阅读,在 nginx 中使用 "if" 语句是 evil!
所以我试图坚持使用 lua 代码来处理类似的事情。

关于我可能在哪里弄乱我的 lua 代码的任何提示?

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

所以没有 "better" 方法可以检查 Lua 中的方法,而不是将它与 GET 和其余方法字符串进行比较。


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

这给您带来的好处是允许您为每个方法配置单独的日志记录、错误处理等。