1、概述
nginx的反向代理功能,使得nginx本身不必自己产生内容,而是把请求交给代理服务器,从代理服务器获取内容,返回给用户,对于解耦非常有用。此外,还有其他一些妙用。
2、有趣的例子
2.1 让你的网站看上去像qq官网
- 配置
location / {
proxy_pass http://www.qq.com/;
}
- 效果截图
除了地址栏的地址不一样,页面内容是不是完全一样!
2.2 替换一些内容
location / {
# 必须设置,不然www.qq.com返回的是gzip压缩过的内容
proxy_set_header Accept-Encoding "";
proxy_pass http://www.qq.com/;
# 使用sub模块
sub_filter_once off; # 可用替换多次
sub_filter "新闻" "旧闻"; # 把 新闻 替换成 旧闻
sub_filter "NBA" "NBC"; # 把 NBA 替换成 NBC
}
- 效果截图
从截图可用看到,只有“NBA”替换成“NBC”成功了,“新闻”替换成“旧闻”失败了,不要着急,下个例子我们解决这个问题。
2.3 处理字符编码
- 打开Chrome浏览器的调试窗口
从截图我们得知,服务器返回的内容经过了gzip压缩,内容编码为GB2312,gzip压缩的问题我们用 proxy_set_header Accept-Encoding “”; 指令解决了。对于编码问题,由于配置文件的编码为UTF-8,网页内容编码为GB2312,所以对于中文,编码不一样,无法用“旧闻”替换“新闻”。把配置文件夹保存为GBK(兼容GB2312)试下。
不出所料,生效了!
2.4 搞点事情
既然有sub_filer模块可以用来替换内容,不如把它发扬光大。
在 2.2 中最后一个sub_filter下面添加一行:
sub_filter "</html>" "<style>.qqlogo{transform:rotateX(180deg)!important;}</style></html>";
该配置指令的作用是在html文件末尾提交一个css样式,让.qqlogo 对应元素的样式翻转180度。果真起作用了,^_^。
2.5 两次proxy_pass
在 2.2 中,我们需要用 proxy_set_header Accept-Encoding “”;配置指令,以便让www.qq.com返回解压缩后的内容,以方便内容替换。这种做法会增加网络流量,那有有没有更好的方法呢?我百度了好久,有人提出用两次proxy_pass,第一次是向远程服务器,获取到的是gzip压缩的内容,第二次是内部proxy_pass,获取到解压后的内容。可惜没有例子。只好自己去试错了,功夫不负有心人,被我给试出来了,^_^。
location / {
# 该行指令与下面 location /pass/ 中的 gunzip on 二选一即可
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
# 内部proxy_pass
proxy_pass http://127.0.0.1/pass$uri;
sub_filter_once off;
sub_filter "新闻" "旧闻";
sub_filter "NBA" "NBC";
sub_filter "</html>" "<style>.a_cover,.qqlogo{transform:rotateX(180deg)!important;}</style></html>";
}
location /pass/ {
#gunzip on;
proxy_pass http://www.qq.com/;
}
跟上例一样的结果。
3、总结
nginx的反向代理功能还是挺强大的,恰当的使用能够实现一些非常有趣的功能。当然了,必须对HTTP协议很熟悉才能更好地使用。
声明:本文所有代码只能作为学习交流之用,万万不可用来做违法之事,否则后果自负。
来源:CSDN
作者:chunyuan314
链接:https://blog.csdn.net/chunyuan314/article/details/55113697