Nginx反向代理通过with-http_sub_module和substitutions4nginx模块替换正文内容和URL

server
{
listen 205.105.100.110:80;
server_name www.baidu.net baidu.net;
sub_filter ‘baidu.com’ ‘baidu.net’;
sub_filter_once on;

location / {
subs_filter_types text/html text/css text/xml text/javascript;
subs_filter baidu.com baidu.net;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Referer http://www.baidu.com[/url]; #强制定义Referer,程序验证判断会用到
proxy_set_header Host www.baidu.com; #定义主机头,如果目标站点绑定的域名个server_name项的吻合则使用$host
proxy_pass http://www.baidu.com; #指定目标,建议使用IP或者nginx自定义池
proxy_redirect http://www.baidu.com [url]http://www.baidu.net;
proxy_set_header Accept-Encoding “”; #清除编码
}
}

Nginx的反向代理功能确实很方便,简单适用,功能强大。
今天醒醒在host1free的免费VPS上也做了一个Nginx的反向代理www.xxorg.com,并通过with-http_sub_module和HttpSubModule模块替换正文内容和URL,把配置的过程记录下来。
使用官方的with-http_sub_module模块只能匹配1条规则,所以使用第三方模块HttpSubModule可以匹配多条规则
host1free的免费VPS上已经按照了lnmp套件,为了省事,直接重编译了。
一、确认已经安装了SVN.
如果安装substitutions4nginx提示错误:-bash: svn: command not found
那么就需要先安装subversion
安装命令:yum -y install subversion
二、重新编译Nginx.
wget -c http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
tar -zxf Nginx-accesskey-2.0.3.tar.gz
svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only
cd /root/lnmp0.9/nginx-1.0.15
./configure –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_gzip_static_module –with-ipv6 –with-pcre –with-http_sub_module –add-module=/root/substitutions4nginx-read-only –add-module=/root/nginx-accesskey-2.0.3
make
make install
注意:
./configure后面的参数如果路径不对找不到的话,按照实际的路径情况修改
substitutions4ngin是用来做替换,支持正则式!
nginx-accesskey据说可以对自己的站进行设置,用于防止他人反代,属于非必要的选项。
现在已经配置好Nginx反向代理并替换正文内容和URL的环境了。
三、新建虚拟主机并配置nginx.conf
1、lnmp环境下新建虚拟主机,执行命令:/root/vhost.sh 根据提示输入域名xxorg.tvvps.com ,其他全部选n.
2、打开“/usr/local/nginx/conf/vhost”下的“xxorg.tvvps.com.conf”进行编辑,也可以下载回本地,修改后再上传。
3、修改“xxorg.tvvps.com.conf”的内容为:
server
{
listen 80;
server_name xxorg.tvvps.com; #绑定的域名
root /var/www/xxorg.tvvps.com; #网站目录(搭配lnamp的时候有用处!)
access_log off; #off 关闭日志
location / {
subs_filter ‘www.xxorg.com’ ‘xxorg.tvvps.com’ gi; #substitutions4nginx替换 (使用方法参照官方)
subs_filter ‘服务器VPS折腾’ ‘TVvps.com技术支持博客’ gi; #substitutions4nginx替换 (使用方法参照官方)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Referer http://www.xxorg.com; #强制定义Referer,程序验证判断会用到
proxy_set_header Host www.hostloc.com; #定义主机头,如果目标站点绑定的域名个server_name项的吻合则使用$host
proxy_pass http://220.181.136.34; #指定目标,建议使用IP或者nginx自定义池
proxy_set_header Accept-Encoding “”; #清除编码
}
}
4、重启lnmp.命令:/root/lnmp restart
到此已经完成了。打开xxorg.tvvps.com你会看到www.xxorg.com的内容,并且关键子被替换了。
五、几个有用的东西。
1、
with-http_sub_module用法:http://wiki.nginx.org/HttpSubModule
substitutions4nginx用法:http://code.google.com/p/substitutions4nginx/
Proxy设置参考nginx官方wiki说明:http://wiki.nginx.org/HttpProxyModule
2、
substitutions4nginx参数:
g(default):替换所有匹配的字符串。
i: 执行不区分大小写的匹配。
o: 只需将第一个。
r: 该模式是作为一个正则表达式处理,默认是固定的字符串。
正则表达式实际使用:
subs_filter ‘<(no?script.*?)>(.*?)<(/no?script.*?)>’ ” gi; //替换掉全部的

subs_filter ‘<(s?cript.*?)>(?:s|S)*?<(/s?cript.*?)>’ ” gi; //替换掉全部的 subs_filter ‘<(i?frame.*?)>(.*?)<(/i?frame.*?)>’ ” gi; //替换iframe 实际测试中sub_filter比subs_filter的速度要快,但如果你开启了nginx的cache速度上可以得到改善的。 测试过程发现对gzip源的内容无法实现替换的问题 可以在server段内加入 proxy_set_header Accept-Encoding ""; 如果是替换中文词组则需要将nginx的配置文件保存为utf-8格式! 本文出处: http://www.xxorg.com/archives/749 nginx反代加替换傻瓜教程(稍详细版) 由于目前使用军哥的lnmp一键包的人较多,本教程基于lnmp0.9!底部有全新安装教程。 1、下载substitutions4nginx模块,这个模块用于替换。

1
2
3
4
5
/root/lnmp stop #停止LNMP服务
cd /root
wget -c http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
tar -zxf Nginx-accesskey-2.0.3.tar.gz
svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only
2、编辑军哥LNMP的upgrade_nginx.sh
1
2
3
4
5
vi /root/lnmp0.9/upgrade_nginx.sh
#移动第86行,在最后加入
--with-http_sub_module --add-module=/root/substitutions4nginx-read-only
#即变成
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --add-module=/root/substitutions4nginx-read-only
3、重新编译nginx
1
2
3
4
/root/lnmp0.9/upgrade_nginx.sh
#会提示Current Nginx Version:1.x.x
#输入升级版本号的时候填回原版本号即可
###如果编译完后,nginx不能重启,就再编译一次吧o(╯□╰)o
4、新建一个虚拟主机用于反代
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vi /usr/local/nginx/conf/vhost/mjj.mjj.im.conf  #mjj.mjj.im是你要绑定的域名,当然你也可以用其他名字.conf
输入以下内容:
server{
listen 80;
server_name mjj.mjj.im;    #绑定的域名
index index.php;      #默认首页
access_log off;        #off 关闭日志
location / {
subs_filter www.hostloc.com mjj.mjj.im;  #替换掉域名
subs_filter static/image/common/logo.png http://www.mjj.im/logo.png; #替换掉LOGO
subs_filter 'http://mjj.mjj.im/uc_server/avatar.php?uid=1&amp;size' 'http://mjj.mjj.im/uc_server/images/noavatar_middle.gif?size';   #替换掉头像
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header   Referer http://www.hostloc.com;    #强制定义Referer,程序验证判断会用到
proxy_set_header   Host www.hostloc.com;          #定义主机头,如果目标站点绑定的域名个server_name项的吻合则使用$host
proxy_pass http://www.hostloc.com;            #指定目标,建议使用IP或者nginx自定义池
proxy_set_header Accept-Encoding "";            #清除编码
        }
}
A、这单引号什么时候加什么时候不加说不清楚,自己试验吧O(∩_∩)O B、如果要替换中文,例如
1
subs_filter '美国' '米国';
要先把conf文件转成utf-8模式。具体操作:用记事本打开conf文件,另存为utf-8编码,再上传即可。 5、重启LNMP
1
/root/lnmp restart
如无意外,此时访问mjj.mjj.im就会看到成功反代并替换了。 #如果要开启日志
1
2
3
4
5
6
7
8
9
10
11
12
13
#在/home/wwwlogs/新建一个域名.log 并赋予www用户644权限
log_format  mjj.mjj.im  '$remote_addr - $remote_user [$time_local] $request '
             '$status $body_bytes_sent $http_referer '
             '$http_user_agent $http_x_forwarded_for';
server{
listen 80;
server_name mjj.mjj.im;     #绑定的域名
index index.php;     #默认首页
access_log  /home/wwwlogs/mjj.mjj.im.log  mjj.mjj.im;   #日志文件
location / {
……
        }
}
下面附全新编译nginx的教程: 1、安装Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#centos系请将apt-get改成yum
apt-get install gcc g++ vim libncurses5-dev make libxml2-dev
apt-get install subversion
apt-get install libpcre3 libpcre3-dev libcurl4-openssl-dev
apt-get install pcre* zlib* openssl*
wget -c  http://nginx.org/download/nginx-1.0.5.tar.gz
tar -zxf nginx-1.0.5.tar.gz
wget -c http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
tar -zxf Nginx-accesskey-2.0.3.tar.gz
svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only
curdir=$(pwd)
cd nginx-1.0.5
./configure --user=nobody --group=nobody  --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --pid-path=/var/run/nginx.pid  --conf-path=/etc/nginx/nginx.conf   --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-pcre --with-http_sub_module --add-module=$curdir/substitutions4nginx-read-only --add-module=$curdir/nginx-accesskey-2.0.3
make
make install
2、配置nginx.conf 编辑/etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server{
listen 80;
server_name mjj.mjj.im;  #绑定的域名
access_log off;        #off 关闭日志
location / {
subs_filter 'www.baidu.com' 'mjj.mjj.im';  #substitutions4nginx替换 (使用方法参照官方)
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header   Referer http://www.baidu.com;    #强制定义Referer,程序验证判断会用到
proxy_set_header   Host www.baidu.com;          #定义主机头,如果目标站点绑定的域名个server_name项的吻合则使用$host
proxy_pass http://www.baidu.com;            #指定目标,建议使用IP或者nginx自定义池
proxy_set_header Accept-Encoding "";            #清除编码
        }
}
3,重启Nginx
1
2
pkill nginx #关闭进程
nginx #启动Nginx
原文地址:http://wang3y2.blog.163.com/blog/static/18328797201282344848800/


已发布

分类

来自

标签: