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

时间:2017-09-11 19:12:07

标签: 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_*指令的表/数组?

1 个答案:

答案 0 :(得分:1)

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

首先定义变量并在脚本中设置值

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";
 }