NGINX-解析请求主体以获取正确的文件

NGINX-解析请求主体以获取正确的文件

我想配置一个 NGINX 服务器,使其返回文件内容,该文件的路径由请求主体中的变量决定。如果可能,不使用 LUA。

当用户调用API时:

curl -X PATCH https://myapipath/1.0.0/devices \
--header 'Authorization: Bearer beb227b4-9c1b-3b49-b86f-b48377ab8c62' \
--data-raw '{"devices":[{"deviceId":"mydeviceid","deviceType":"mydevicetype"}]}'

服务器应该返回此路径下的文件:mypath/mydeviceid/mydevicetype/devicedetails.json。我已经在 NGINX conf 中配置了这个位置,但我不知道如何添加解析逻辑来从请求主体中获取deviceId和的值:deviceType

location myapipath/1.0.0/devices{alias /mypath/devicedetails.json;error_page 405 =200 $uri;}

你能帮我做这件事吗?

提前致谢。

答案1

nginx 不是设计来执行这样的应用程序逻辑的。

您需要使用 Lua 模块或njs 模块来实现这样的逻辑。

另一种方法是在应用程序中实现后端逻辑(PHP,Python,Ruby,Perl 等),然后应用程序将返回响应X-Accel-重定向标头告诉 nginx 应该发送什么文件。

答案2

这可以使用 Nginx 中的 Lua 来完成。

server {
    listen 80 default_server;

    location = /1.0.0/devices {

            default_type application/json;
            resolver 1.1.1.1;
            set $deviceId '';
            set $deviceType '';

            rewrite_by_lua_block {

                    local json = require "cjson.safe"
                    ngx.req.read_body()
                    local body = ngx.req.get_body_data()

                    if not body then
                            ngx.exit(ngx.HTTP_BAD_REQUEST)
                    end

                    local data, err = json.decode(body)

                    if err then
                            ngx.exit(ngx.HTTP_BAD_REQUEST)
                    end

                    local deviceId = data.deviceId
                    local deviceType = data.deviceType
                    ngx.var.deviceId = deviceId 
                    ngx.var.deviceType = deviceType 

            }

            set $proxy_endpoint = https://api.tld/mypath/$deviceId/$deviceType/devicedetails.json;
            proxy_pass $proxy_endpoint;

    }

}

  • 使用 LUA 的 json 解析器从 JSON Payloads 中提取两个变量。
  • 将它们传递给 nginx
  • 定义包含两个变量的代理路径

尽管这可以与格式正确的 JSON 有效负载一起工作,但需要添加逻辑以正常处理无效或损坏的有效负载。

还有安全方面的考虑:这两个变量必须被清理。

相关内容