我想配置一个 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 有效负载一起工作,但需要添加逻辑以正常处理无效或损坏的有效负载。
还有安全方面的考虑:这两个变量必须被清理。