You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Nginx反向代理的响应进行后处理:拦截修改HTML

Nginx反向代理结合Lua修改HTML响应配置方案

要实现反向代理嵌入式服务器的同时修改响应HTML,你需要借助Nginx的Lua模块(推荐用OpenResty,自带完整Lua生态),通过响应体过滤阶段的Lua脚本处理内容。以下是完整配置和说明:

核心配置示例

server {
    listen       80;     
    server_name  www.website.com;

    location /device1 {         
        proxy_pass http://1.1.1.1:8080;
        
        # 传递必要请求头给后端服务器
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 开启响应缓冲(必须开启,否则无法完整修改响应体)
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 4 4k;
        
        # 禁用后端压缩,避免处理压缩内容(可选,若需保留压缩需额外Lua解压逻辑)
        proxy_set_header Accept-Encoding "";

        # Lua响应体处理逻辑
        body_filter_by_lua_block {
            # 缓存分块响应体
            local chunk = ngx.arg[1]
            local is_end = ngx.arg[2]
            local ctx = ngx.ctx

            ctx.buffered = (ctx.buffered or "") .. chunk

            if is_end then
                -- 所有响应体接收完成,开始处理
                local html = ctx.buffered

                # 1. 移除指定标签(示例:移除class为unwanted的div标签及内容)
                html = string.gsub(html, '<div[^>]+class="unwanted".->.-</div>', '')

                # 2. 添加自定义CSS到<head>末尾
                local custom_css = [[
                    <style>
                        body { background: #f5f5f5; }
                        .main-content { padding: 20px; }
                    </style>
                ]]
                html = string.gsub(html, '</head>', custom_css .. '</head>')

                # 替换处理后的响应体
                ngx.arg[1] = html
                ctx.buffered = nil
            else
                # 未接收完,清空当前片段,继续缓存后续内容
                ngx.arg[1] = nil
            end
        }
    }
}

关键说明

  • Lua模块依赖:确保Nginx已集成ngx_http_lua_module,直接用OpenResty是最便捷的方式,无需手动编译模块。
  • 响应缓冲:proxy_buffering on是必须的,Nginx会先把后端响应完整缓存下来,再交给Lua脚本处理,否则分块返回时无法修改完整内容。
  • 分块处理:大响应会被Nginx拆分为多个chunk,通过ngx.ctx缓存所有片段,直到响应结束(is_end为true)再统一处理。
  • 正则匹配调整:根据实际需求修改string.gsub的正则表达式,比如要移除<script>标签可替换为'<script.-</script>',注意用.-实现非贪婪匹配,避免误删过多内容。
  • 压缩处理:如果后端返回gzip压缩内容,需先解压才能修改,最简单的方式是通过proxy_set_header Accept-Encoding ""让后端返回未压缩HTML,修改后可通过Nginx的gzip配置重新压缩返回给客户端。

内容的提问来源于stack exchange,提问作者Bigbob556677

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:40:59