在 OpenResty 中,你可以使用 header_filter_by_lua_block
和 body_filter_by_lua_block
指令来修改响应体内容。以下是一个示例,展示如何使用这些指令修改响应体内容:
- 使用
header_filter_by_lua_block
修改响应头 - 使用
body_filter_by_lua_block
修改响应体
以下是一个示例配置:
server {listen 80;server_name example.com;location / {proxy_pass http://upstream_server;header_filter_by_lua_block {-- Modify the response headers herengx.header["Content-Type"] = "text/html; charset=utf-8"}body_filter_by_lua_block {local chunk, eof = ngx.arg[1], ngx.arg[2]-- Initialize buffer to collect chunksngx.ctx.buffer = ngx.ctx.buffer or {}if chunk ~= "" thentable.insert(ngx.ctx.buffer, chunk)endif eof thenlocal body = table.concat(ngx.ctx.buffer)-- Modify the body contentbody = string.gsub(body, "old_text", "new_text")-- Set the modified body to be sent as the responsengx.arg[1] = bodyelse-- Set ngx.arg[1] to an empty string to prevent sending incomplete responsengx.arg[1] = nilend}}
}
解释:
-
header_filter_by_lua_block:
- 用于修改响应头。
- 在此示例中,我们将
Content-Type
设置为text/html; charset=utf-8
。
-
body_filter_by_lua_block:
- 用于修改响应体内容。
ngx.arg[1]
包含当前的响应体片段。ngx.arg[2]
是一个布尔值,指示是否为最后一个响应片段。- 我们将所有响应片段收集到
ngx.ctx.buffer
中。 - 当所有片段都接收到时(即
eof
为true
),我们将它们连接成一个完整的响应体,并进行字符串替换(例如,将old_text
替换为new_text
)。 - 修改后的响应体将被设置为
ngx.arg[1]
,以便发送到客户端。
确保将此配置添加到 OpenResty 的 Nginx 配置文件中,并替换 example.com
和 upstream_server
为实际的服务器名称和上游服务器地址。
这样,当客户端请求 example.com
时,OpenResty 将修改响应体内容并将其发送回客户端。