sub_filter无法匹配script标签是因为默认跳过gzip压缩和chunked响应;需禁用压缩、启用缓冲并显式设置sub_filter_types text/html。

sub_filter 指令为什么无法匹配到 HTML 中的 script 标签
默认情况下 sub_filter 只处理响应体中「已解压」且「未分块传输」的内容,而现代前端应用常通过 gzip 压缩 + Transfer-Encoding: chunked 返回 HTML。Nginx 在启用 gzip 或收到分块响应时会跳过 sub_filter 处理,导致你写的 sub_filter '' '<script src="/monitor.js"></script>'; 完全不生效。
解决路径很明确:关掉上游压缩、禁用分块、强制 Nginx 接收完整响应后再替换。实操建议如下:
- 在 upstream 或 proxy_pass 对应的 location 块中添加
proxy_set_header Accept-Encoding "";,让后端不返回 gzip 内容 - 加上
proxy_buffering on;和足够大的proxy_buffer_size(如128k),确保整个 HTML 被缓存进内存再处理 - 确认后端没有设置
Transfer-Encoding: chunked;若无法控制后端,可加proxy_http_version 1.0;强制降级,Nginx 会自动合并 chunk 并关闭流式传输
如何安全注入脚本而不破坏原有 HTML 结构
sub_filter 是纯字符串替换,不解析 HTML,所以直接匹配 很危险:可能误中注释里的
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











