最近需要转发一些被墙但是又无害的数据, 然后发现转发的数据里面(是个配置文件)还有别的被墙的域名, 所以这时候就需要用到
nginx
的sub_filter
来进行替换了, 然而发现...好像没什么用...
问题
主要问题还是因为gzip的关系, 大部分网站传输数据的时候都进行了gzip压缩, 这就导致sub_filter
无法处理gzip数据最后替换失败了...
解决方案
既然gzip无法替换, 那解压缩后再替换不就好了吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
server { listen 80; listen 443 ssl http2; server_name raw.githubusercontent.cc; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/raw.githubusercontent.cc; ssl_certificate /www/server/panel/vhost/cert/raw.githubusercontent.cc/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/raw.githubusercontent.cc/privkey.pem; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; location /go/ { # 负责解压缩内容 proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host raw.githubusercontent.com; #目标域名 proxy_redirect off; proxy_http_version 1.1; proxy_buffering off; proxy_pass https://raw.githubusercontent.com/; #目标域名 } location / { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host raw.githubusercontent.cc; #自己的域名 proxy_redirect off; proxy_http_version 1.1; proxy_buffering off; proxy_set_header Accept-Encoding ''; gzip off; sub_filter_types *; #替换所有类型 sub_filter '//github.com' '//github.xiaoc.cn'; #替换内容 sub_filter '//raw.githubusercontent.com' #替换内容 '//raw.githubusercontent.cc'; sub_filter_once off; #所有匹配到的都替换 proxy_pass http://127.0.0.1/go/; #多走一次转发, 让/go先解压缩gzip } access_log /www/wwwlogs/raw.githubusercontent.cc.log; error_log /www/wwwlogs/raw.githubusercontent.cc.error.log; } |
GPT
如果您在Nginx中启用了gzip压缩,并且同时使用sub_filter模块进行内容替换,那么可能会遇到sub_filter无效的问题。这是因为gzip压缩会将响应体(response body)压缩成二进制格式,而sub_filter模块只能处理文本格式的响应体。
为了解决这个问题,您可以通过以下步骤禁用gzip压缩对于指定的请求:
- 在Nginx配置文件中,找到gzip相关的配置项,并添加no-gzip作为需要禁用gzip压缩的请求的正则表达式。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
http { gzip on; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; server { ... location /example { # 禁用gzip压缩 gzip off; # 执行sub_filter sub_filter "foo" "bar"; sub_filter_once on; ... } } } |
在这个示例中,location /example
中的请求将不再使用gzip压缩,并且sub_filter模块将能够正确地替换响应体中的文本内容。
- 重新加载Nginx配置以使更改生效:
1 |
sudo nginx -s reload |
希望这个解决方案可以帮助您解决问题。
你好,请教一下/go是怎样实现解压的。
解压什么?zip?还是rar? 不同压缩包格式不同,得用不同的工具才行