orange
orange copied to clipboard
使用分流插件后获取post请求参数问题
有同学经常提问针对application/x-www-form-urlencoded类型的post请求,在使用分流插件后获取不到post参数,大部分都是因为配置不当或者对Nginx相关知识点理解不清晰导致的。
下面介绍一个相关issue的正确配置:
- nginx.conf里配置一个upstream:
upstream business_upstream {
server 127.0.0.1:8003;
}
- 然后配一个server用来作为business_upstream的服务提供者:
server {
listen 8003;
server_name localhost 127.0.0.1;
access_log ./logs/business_upstream_access.log main;
error_log ./logs/business_upstream_error.log;
location / {
content_by_lua_block {
-- 读取get和post(x-www-form-urlencoded)请求的参数
ngx.req.read_body()
local post_params = ngx.req.get_post_args() -- 获取post请求还有另一个方法ngx.req.get_body_data(),这两个API的区别请自行查看官方文档
local query = ngx.req.get_uri_args()
-- 组装参数用于展示
local q = ""
for i, v in pairs(query) do
q = i .. ":" .. v .. " " .. q
end
local p = ""
for i, v in pairs(post_params) do
p = i .. ":" .. v .. " " .. p
end
-- 打印获取到的参数
ngx.say("business_upstream, uri:" .. ngx.var.uri .. " query:[" .. q .. "] post:[" .. p .. "]")
}
}
}
- 在dashboard上分流插件配置一个规则,将符合条件的流量打到这个business_upstream上

- 用postman来测试

如上图,发送application/x-www-form-urlencoded类型的post请求,能正确获取get和post参数。
同样的,发送get请求,也能正确获取到query参数。
关于分流插件的另一个常见问题
使用分流插件时,如果对Nginx的proxy和upstream相关知识点理解不清楚,不要在填写upstream url时在真实的upstream后面拼接任何字符串。当然,如果你非常清楚Nginx的proxy_pass等指令的用法,可以随意使用。此问题可参考这个相关issue
good doc 👍
@sumory 你好 在这个案例中是必须先在nginx.conf中配置: upstream business_upstream { server 127.0.0.1:8003; } 对吧
divide组件支持动态分配upstream吗?