OpenResty Nginx为何将上游XML响应自动转为JSON?
问题分析与解决思路
核心问题
直接请求上游服务器返回预期XML响应,但通过OpenResty代理后返回JSON格式,需排查配置或模块层面的异常。
可能原因及排查修复步骤
1. 配置语法错误
你的router.conf中server_name reverse-proxy.test.com行末尾缺少分号,这会导致Nginx配置解析失败,引发不可预期的请求处理逻辑。
- 修复:给该行添加分号:
server_name reverse-proxy.test.com; - 操作:重启OpenResty后重新测试。
2. 请求头重复覆盖问题
在location配置中,你重复设置了Accept请求头:
proxy_set_header Accept $http_accept; proxy_set_header Accept application/xml;
后一条指令会完全覆盖前一条,上游收到的Accept头固定为application/xml。若上游服务器会根据Accept头返回不同格式响应,需确认:
- 代理指向的上游(api1对应testserver1)和你直接测试的上游(testserver2)是否为同一服务实例,若为不同实例,可能存在配置差异;
- 调整
Accept头设置:要么保留客户端原请求头,要么明确指定所需格式,避免重复设置。例如保留客户端原头:proxy_set_header Accept $http_accept;
3. Lua模块的隐式转换
你安装了lua-resty-http等Lua模块,需检查所有配置文件,确认是否存在未注意到的Lua代码(如响应拦截逻辑),对上游返回的XML进行了JSON转换。OpenResty允许通过Lua代码修改响应体,这可能是格式转换的根源。
4. 上游连接复用异常
你启用了上游连接的keepalive特性:
keepalive 16; keepalive_time 20m; keepalive_timeout 60s;
若复用的连接曾发送过不同的Accept头,可能导致上游返回错误格式的响应。
- 测试:临时注释掉keepalive相关配置,重启后测试是否仍返回JSON。
内容的提问来源于stack exchange,提问作者Zack Thomas
相关产品推荐
相关产品推荐

