前两天在iredmail官方群里看到iredmai.org被人镜像了。使用的工具很简单nginx+一个第三方模块(apache也有同样的模块,而且较nginx的更早有,后面会提到) --成本低廉,配置简单,功能强大。是盗站镜像必备之良器。这里对此做个总结。

关于nginx的镜像功能的模块在github上有两个项目,一个是nginx_substitutions_filter ,一个是nginx-subfilter-module 。前者是托管在code.google.com上的一个项目 --substitutions4nginx ,在nginx官方的wiki上提到的也是该模块,这里要讲的也是这个 。有兴趣的人可以试下另个一个模块。

一、安装

1git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
23svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only
4./configure --add-module=/path/to/module
5make && make install

我这里是使用的tengine进行的编译,可以通过下nginx -V查看:

 1[root@localhost sbin]# ./nginx -V
 2Tengine version: Tengine/1.5.1 (nginx/1.2.9)
 3built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
 4TLS SNI support enabled
 5configure arguments: --add-module=/usr/local/src/tengine-1.5.1/ngx_http_substitutions_filter_module/ --prefix=/App/nginx
 6loaded modules:
 7    ngx_core_module (static)
 8    ngx_errlog_module (static)
 9    ngx_conf_module (static)
10    ngx_dso_module (static)
11    …………………………省略
12    ngx_http_subs_filter_module (static)
13    ngx_http_copy_filter_module (static)
14    ngx_http_range_body_filter_module (static)
15    ngx_http_not_modified_filter_module (static)

二、配置

以下是当时镜像的那哥们的配置,现列出如下:

 1server {
 2        listen 80;
 3        server_name www.iredmail.net;
 4        index index.php index.html index.htm;
 5        location / {
 6if ($http_user_agent ~* (baiduspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) {
 7        return  403;
 8        }
 9default_type text/html;
10     proxy_cache amproxy;
11         subs_filter_types text/css text/xml;
12     echo_before_body '<p style="text-align: center">本站非iRedMail官方网站,仅为镜像,所有文字以及图像、设计版权归原作者所有。原始网站请访问 http://www.iredmail.org</p>';
13     echo_after_body '';
14     subs_filter 'iredmail.org' 'iredmail.net' g;
15         proxy_set_header X-Real-IP  $remote_addr;
16         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
17         proxy_set_header Referer http://www.iredmail.org;
18         proxy_set_header Host www.iredmail.org;
19         proxy_pass http://www.iredmail.org;
20         proxy_set_header Accept-Encoding "";
21        }
22}

当时试了下,速度不错,而且解决了iredmail.org被墙的问题 。去做镜像的这哥们看来不是为了做坏事,对扒取收录的蜘蛛做了屏蔽 。

注:

1、上面的配置中echo_before_body、echo_after_body用的是另个一个模块HttpEchoModule 。没安装该模块的需要将上面两处清理掉再用。

2、proxy_cache,使用了nginx的cache缓存加速 ,后面的amproxy在其他地方有定义,所认直接用时,把该句也需要拿掉,除非也想使用nginx的cache加速 。

三、参数

上面的配置大部分都是和该文中提到的模块无关的,该模块使用的参数有subs_filter_typessubs_filter两个。subs_filter_types指明了替换的类型,默认是text/html格式;subs_filter主要做文本内容替换 ,使用到的参数有g、i、o、r四个 。这里对这两个参数的用法不做详细介绍,直接列下官方说明。

subs_filter_types

1syntax: subs_filter_types mime-type [mime-types]
2default: subs_filter_types text/html
3context: http, server, location

subs_filter_types is used to specify which content types should be checked for subs_filter. The default is only text/html.

This module just works with plain text. If the response is compressed, it can’t uncompress the response and will ignore this response. This module can be compatible with gzip filter module. But it will not work with proxy compressed response. You can disable the compressed response like this:

proxy_set_header Accept-Encoding "";

subs_filter

1syntax: subs_filter source_str destination_str [gior]
2default: none
3context: http, server, location

subs_filter allows replacing source string(regular expression or fixed) in the nginx response with destination string. Substitution text may contain variables. More than one substitution rules per location is supported. The meaning of the third flags are:

  • g(default): Replace all the match strings.
  • i: Perform a case-insensitive match.
  • o: Just replace the first one.
  • r: The pattern is treated as a regular expression, default is fixed string.

四、中文替换

使用subs_filter时,中文替换需要做编码转换 ,转成16进制后再进行替换 ,具体详见官方wiki 。引用下官方wiki的例子,如果想把‘你好’替换成‘aaabbb’ 则使用下面的代码替换:

1subs_filter 'xe4xbdxa0xe5xa5xbd' 'aaabbb' r;

上面的是为了取消转义,x代表16进制 。针对uft8、gb2312等编码可以利用web在线工具转换。这里列一个gb2312在线编码的转换工具

最后列下Apache’s mod_substitute的地址,有兴趣的可以试试apache的模块。