使用 Nginx 上的 Lua 对代理请求进行过滤

我想在使用 Nginx 的 proxy_pass 和 Lua 的情况下,对流媒体 URL 进行过滤。

我的流媒体服务器是 http://localhost:8092

我希望访问 http://localhost:8080/streami1?token=mytoken 时它将被转发到 http://localhost:8092/stream1。如果你访问 http://localhost:8080/streaming1?token=abc,将显示权限拒绝页面。

以下是我的 Nginx 配置文件的代码:

  location ^~ /stream {
            set $flag_false "false";
            set $flag "false";
            set $flag_true 1;
            rewrite_by_lua '
                    local token = ngx.var.arg_token
                    if token == "mytoken" then
                            ngx.var.flag = ngx.var.flag_true
                    end

            ';
            # rewrite_by_lua "ngx.var.flag = ngx.var.flag_true";
            if ($flag = $flag_true) {
                    proxy_pass http://x.x.x.x:8092;
                    break;
            }
            echo "You do not have permission: $flag";
   }

但是,它没有通过流媒体服务器,而是在使用 http://localhost:8080/streaming1?token=mytoken URL 请求时显示了 "You do not have permission: 1"。显然,它将 flag 值更改为 1,但它没有通过我的流媒体。 我的错误在哪里?请帮我。

点赞
用户1009249
用户1009249
  1. rewrite_by_lua 指令始终在标准的 ngx_http_rewrite_module (ifset 指令) 运行之后。您可以使用 set_by_lua 指令代替。

  2. if (condition) {} 语句中的“=”和“!=”运算符将变量与 字符串 进行比较,这意味着 if 条件中的 $flag_true 不会被评估为 1

修改后的配置如下所示:

    location ^~ /stream {
        set $flag_true 1;
        set_by_lua $flag '
            local token = ngx.var.arg_token
            if token == "mytoken" then
                return ngx.var.flag_true
            end
            return "false"
        ';
        if ($flag = 1) {
            proxy_pass http://x.x.x.x:8092;
            break;
        }
        echo "You do not have permission: $flag";
    }
2016-03-30 17:31:13