我已经使用 Openresty 设置了一个 nginx 代理。该代理占用了一个 HTTP SOAP POST要求,使用在 HTTP 服务器 8080 端口的根位置(“/”)内编写的 LUA 脚本对其进行修改,然后将其发送到后端服务器进行处理,该服务器正常工作。
当代理将连接中继到后端服务器时,它会根据 TCP 规范创建一个新的连接,并生成一个不同于端口 8080 的新源端口,后端服务器应该在此端口进行响应。
有没有办法拦截回复在 nginx 上,以便它能够拦截此类响应并使用 LUA 脚本对其进行相应的修改?
感谢您提供的任何见解。
答案1
以下是基于我之前的回答的示例:
location / {
access_by_lua '
ngx.req.read_body()
local body = ngx.req.get_body_data()
body = string.gsub(body, "_v4", "_v2")
ngx.req.set_body_data(body)
local header = ngx.req.get_headers()["Content-Type"]
header = string.gsub(header, "_v4", "_v2")
ngx.req.set_header("Content-Type", header)
';
proxy_pass http://192.168.1.3:1234;
body_filter_by_lua '
# getting response body
local body = ngx.arg[1]
# response body is in a "body" variable now
# do some modifications with "body" variable
# just an example: convert body to uppercase
body = string.upper(body)
# setting back modified response body
ngx.arg[1] = body
';
}
如果您的响应主体足够大,事情可能会变得更加复杂,因为响应是按部分处理的(按 nginx 术语中的数据块处理)。