如何将nginx变量设置为Lua表/数组

如何从 set_by_lua_* 指令中返回一个表/数组,以便稍后可以由另一个 set_by_lua_* 指令读取?

我的意图是一次返回一个复杂的值,然后将返回值的各个部分放入其他变量中。在理想的世界中,我会写这样一个代码(非工作代码示例):

location {
    set_by_lua_file $info '/my/library/do_stuff_with_headers_and_env.lua';

    set_by_lua $language 'return $info["language"]';
    set_by_lua $best_server 'return $info["server"]';
    set_by_lua $last_user 'return $info["user"]';

    echo "Best server for $language is $best_server (last used by $last_user)";
}

可以使用ngx.var 在脚本内简单地设置这些变量,但我希望将脚本文件编写为一种库,让用户仅提取他们需要的信息部分。

鉴于 set_by_lua_* 不支持表/数组(set_by_lua $x 'return {"foo", "bar"}';$x 设置为 nil),是否有最佳实践,解决方法或惯用的方法可以从 set_by_lua_* 指令中返回一个表/数组?

点赞
用户2830850
用户2830850

有两种方法可以做到这一点:

首先定义变量,然后在脚本中设置值

location / {
    set_by_lua $language '';
    set_by_lua $best_server '';
    set_by_lua $last_user '';

    set_by_lua_file $info '/my/library/do_stuff_with_headers_and_env.lua';

    echo "Best server for $language is $best_server (last used by $last_user)";
}

do_stuff_with_headers_and_env.lua中,您将拥有以下内容

local info = {language ="english"}
ngx.var.language = info["language"]

以编码形式定义变量

location / {
    set_by_lua $info '
         local cjson=require("cjson")
         return cjson.encode({language="english"})
       ';

    set_by_lua $language '
         local cjson=require("cjson")
         return cjson.decode(ngx.var.info)["language"];
       ';

    echo "Best server for $language";
 }
2017-09-12 07:03:19