Hugh's Blog

Nginx 转发时 sub_filter 不生效

 

最近在使用 proxy_pass 反向代理的时候,需要修改上游的一个 js 文件的内容,按照文档使用 sub_filter,但是并没有生效,具体原因是 nginx 的 sub_filter 无法识别经过 gzip 压缩的数据,所以会忽略该指令,最简单的方法是关闭上游的压缩,需要添加 proxy_set_header Accept-Encoding "";,具体配置如下:

location / {
    proxy_pass http://remote_host;
    # ...
    proxy_set_header Accept-Encoding "";

    sub_filter 'old_content' 'new_content';
    sub_filter_types *;
    sub_filter_once off;
}

这个处理方法虽然简单,但是由于关闭了上游的压缩,因此本机入站的流量会有所增加,网上找到另一种解决方法:nginx 新增一个反向代理,利用 gunzip 模块先解压,然后返回数据,这样子开销不大,入站流量不变,可以尝试一下,具体看参考链接。


参考

Why my nginx sub_filter reverse-proxy not working?

Nginx 反代 Gzip 内容时, sub_filter 等 content filter 无效的另一种解决