Nginx配置动态替换

  Nginx的ngx_http_sub_module模块可以很方便的实现:在返回资源时动态替换某些关键字。但是这个模块默认并没有启用,在编译时需要手动添加--with-http_sub_module编译参数。要查看当前Nginx是否集成该模块,可以使用如下命令:

1
nginx -V 2>&1 | grep -q http_sub_module && echo "ok"

关键配置项

  • sub_filter old_text new_text;:将旧文本替换为新文本,可以放在httpserverlocation范围下
  • sub_filter_once on;:是否仅替换一次,默认on
  • sub_filter_types mime-type;:过滤的mime类型,默认为text/html,所有为*

使用例子

官网给出的参考用例:

1
2
3
4
5
location / {
sub_filter '<a href="http://127.0.0.1:8080/' '<a href="https://$host/';
sub_filter '<img src="http://127.0.0.1:8080/' '<img src="https://$host/';
sub_filter_once on;
}

配置在www.i5zhen.com上的用例,直接反代关于页面的同时,替换资源至源站:

1
2
3
4
5
6
7
8
location / {
proxy_pass https://blog.kuretru.com/about/;
proxy_set_header Host blog.kuretru.com;
proxy_set_header Accept-Encoding "";
sub_filter '="/' '="https://blog.kuretru.com/';
sub_filter_once off;
include default.d/proxy.conf;
}

注意点

  • sub_filter_types text/html;默认已配置,若重复配置会出错
  • 反代时若源服务器启用了gzip压缩,则需要加上请求头Accept-Encoding指定为空,要求对方不压缩
  • 新旧字符串内不需要转义字符

参考文献