【问题标题】:proper way to check for request method in nginx_lua在 nginx lua 中检查请求方法的正确方法
【发布时间】:2015-02-25 13:55:31
【问题描述】:

我正在尝试使用 nginx 和 lua 编写一个 REST 接口。我想知道的是,检查请求方法的最佳方法是什么?如果是 GET,我需要查询一个 db。如果是 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 代码的任何提示?

【问题讨论】:

  • 只需与'GET' 字符串比较。 If 是邪恶的,但有时仍然比其他任何东西都好。你有很不自然的例子。你真正想做什么?
  • 它有什么不自然的地方?你能扩展吗?我全神贯注,因为我只是 nginx 的新手。现在的代码只是测试代码,但话虽如此,检查请求类型是很正常的,不是吗?然后我唯一的其他逻辑是解析输入
  • @AlexeyTen。我知道我可以将它与字符串 GET 进行比较,但我想我想知道是否有另一种方法,比如使用一些现有的常量,我只是不熟悉。
  • 我的意思是,检查请求方法不是目标,而是做其他事情的一种方式。如果您解释真正的问题是什么会更好。可能有更简单,更清洁的方法来解决它。
  • GET 是常数。您应该与之比较的确切三个字节

标签: nginx lua


【解决方案1】:

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

因此,在 Lua 中检查您的方法没有比将其与 GET 和其余方法字符串进行比较“更好”的方法了。


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

这让您可以为每个方法配置单独的日志记录、错误处理等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2021-04-29
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多