如何在Nginx location块中提取$request_body字段与特定值比较
实现方案说明
Nginx原生不支持直接解析JSON格式的请求体,可根据场景选择以下两种实现方式:
方案1:原生Nginx正则匹配(无需额外模块,适合请求格式可控的简单场景)
直接通过正则匹配$request_body中的name字段值,补全后的if判断逻辑如下:
if ($request_body ~* "\"name\"\s*:\s*\"nico\"") { return 201 "{}"; }
注意:该方案依赖JSON结构的稳定性,若请求内字段顺序、引号格式、空格缩进不固定可能出现匹配失败的问题,仅推荐内部接口、请求格式完全可控的场景使用。
方案2:Lua模块解析JSON(更稳定,推荐生产环境使用)
如果你的Nginx已集成ngx_http_lua_module(OpenResty发行版默认自带该模块),可以通过Lua代码正式解析JSON后做字段对比,不受JSON格式、字段顺序影响,完整配置如下:
server { listen 8080; location /my-post-api { default_type 'application/json'; add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; # 提前读取请求体 lua_need_request_body on; access_by_lua_block { local cjson = require "cjson" local req_body = ngx.req.get_body_data() local data = cjson.decode(req_body) if data.name == "nico" then ngx.status = 201 ngx.say("{}") return ngx.exit(ngx.HTTP_OK) end } return 404 "{}"; } }
注意:该方案需要Nginx提前安装Lua模块或直接使用OpenResty发行版,解析逻辑可靠,适配所有合法JSON格式的请求。
内容的提问来源于stack exchange,提问作者Possenti
相关产品推荐
相关产品推荐

