Nginx系列之反向代理的妙用

来源:互联网 发布:catiav5r20 软件下载 编辑:程序博客网 时间:2024/05/17 05:02

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协议很熟悉才能更好地使用。

声明:本文所有代码只能作为学习交流之用,万万不可用来做违法之事,否则后果自负。

0 0
原创粉丝点击