说到反向代理,大家可能就要联想到正向代理,不了解正向代理建议先阅读:浅析nignx的正向代理功能及其应用

反向代理的原理

其实也很容易理解,比如我访问:http://www.vuln.cn/test(举例而已) 的这个页面,看上去这个页面是在我服务器上,实际上这个页面内容可能是我从其他网站偷偷取过来的内容返回给用户,但表面上却看不出来,实际的response也是来自于vuln.cn,这种功能的实现就是反向代理。

结论就是,反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

一般可以配置单独某个链接反向代理,也可以配置全站反向代理。

nginx反向代理

反向代理的应用

JS实现跨域

跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。所谓同源是指,域名,协议,端口相同。浏览器执行javascript脚本时,会检查这个脚本属于那个页面,如果不是同源页面,就不会被执行。

所以当我们网站需要调用其它网站的一个js的时候,如果这个js中功能无法生效,我们可能就需要做反向代理,来让这个js就像在自己网站一样,这样就实现了同域。

镜像网站

你可能经常听到镜像网站,谷歌镜像,但你可能不知道镜像就是反向代理所实现的,那么现在我们会了镜像网站,那能干的事情就多了。

做seo还要做网站吗?你可以直接镜像一个别人做的比较好的网站,而你所需要做的仅仅是买个域名,配一下反向代理,一个内容丰富的网站即可完成,还可以修改任何内容(下面会说明)。

如何配置反向代理

关于配置参数,这里我直接放出我自己记得笔记,相信大家多尝试应该可以理解。

 

server
 {
 listen 80 default_server;
 #listen [::]:80 default_server ipv6only=on;
 server_name vuln.cn;

 proxy_set_header Host www.163.com; #设置host
 proxy_set_header x-forwarded-for $remote_addr;

 location / {
 proxy_pass http://www.163.com; #代理目标站域名
 sub_filter 'www.163.com' '$host'; #使用http_sub_module,替换字符串,模块介绍地址:http://nginx.org/en/docs/http/ngx_http_sub_module.html#sub_filter_types,注,与http_subs_module不同。
 sub_filter_once off; #指定替换几次,一般off批量替换,on只替换一次
 sub_filter_types *; #指定类型, text/html text/css text/xml
 proxy_set_header Accept-Encoding ""; #如果原网页被gzip压缩了,要设置此项。
 proxy_buffering off; #关闭缓存(随机应变)
 }
 index index.html index.htm index.php;
 root /home/wwwroot/default;
 #下面处理图片与js打不开情况,也是正则
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

 {

 proxy_pass http://www.163.com; #指定这个资源让这个代理服务器来处理,如在本地,则使用: root /home/wwwroot/paper/;

 if (-f $request_filename) {

 expires 1d; #缓存时间

 break;

 }

 }

 location ~ .*\.(js|css)$

 {

 proxy_pass http://www.163.com; #与图片处理方式同理

 if (-f $request_filename) {

 expires 1d;

 break;

 }

 }

以上,还是相对比较全的,如果我希望某个页面用我自己本地的内容怎么办?还是针对性的做规则

如robots.txt这个文件我想调用本地的,

 

location ~ robots\.(txt)$ { 

         root /home/wwwroot/paper/;

         }

比如我要跨域调用某个js

location  /webservice.js { 

        proxy_pass http://www.163.com/1.js; #调用163下该1.js,实现访问本地webservice.js即访问www.163.com/1.js
       }

更多功能大家可以自己去