Nginx中的Rewrite的重定向配置与实践


转载自 https://www.cnblogs.com/tugenhua0707/p/10798762.html#_labe2

一:理解地址重写 与 地址转发的含义。
  • 二:理解 Rewrite指令 使用
  • 三:理解if指令
  • 四:理解防盗链及nginx配置
  •   简介:Rewrite是Nginx服务器提供的一个重要的功能,它可以实现URL重定向功能。 回到顶部回到顶部http://localhost:3001');
    });

    然后在命令行中 运行 node app.js 后,运行,我们就可以在浏览器中 访问 http://localhost:3001 就可以访问到我们对应的页面了。但是现在我想把该node项目
    部署到我本地的nginx服务器上。nginx安装请看我 然后我想使用域名来访问我们的项目,因此我们需要在我们的nginx.conf中配置一下:

    cd /usr/local/etc/nginx

    然后使用命令:sudo open /usr/local/etc/nginx/nginx.conf -a 'sublime text' 命令打开 nginx.conf 配置如下:

    worker_processes  1;
    

    events {
    worker_connections 1024;
    }
    http {
    include mime.types;
    default_type application
    /octet-stream;

    sendfile on;
    #tcp_nopush on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    #gzip  on;
    
    server {
      listen       8081;
      server_name  localhost;
      location / {
        root   html;
        index  index.html index.htm;  
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
    

    root html;
    }
    }
    server {
    listen
    8088;
    server_name xxx.abc.com;
    location
    / {
    proxy_pass http:
    //127.0.0.1:3001;
    rewrite ^/(.*) http://www.baidu.com permanent;
    }
    }
    }

    如上代码,我监听端口号是8088,然后server_name 配置设置为 xxx.abc.com, 然后当我们访问 http://xxx.abc.com:8088/的时候,会先反向代理到我们的http://127.0.0.1:3001下的node对应的页面上来,反向代理完成后,会使用 rewrite 重定向百度页面去了。如上配置完成后,我们需要重启下nginx服务器;使用命令:

    然后当我们在浏览器访问 http://xxx.abc.com:8088/ 的时候,会执行如下图所示,它会先对 http://xxx.abc.com:8088/ 进行永久重定向(301), 然后会访问百度(307),临时重定向到百度页面来,最终加载百度页面的地址;如下演示所示:

    但是如果我把 permanent 改成 redirect 的话,比如nginx配置:rewrite ^/(.*) http://www.baidu.com redirect; 后,它就会变成302临时重定向了。如下所示:

    回到顶部回到顶部

    四:理解防盗链及nginx配置

    什么是防盗链?盗链可以理解盗图链接,也就是说把别人的图片偷过来用在自己的服务器上,那么防盗链可以理解为防止其他人把我的图片盗取过去。

    防盗链的实现原理:客户端向服务器端请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回客户端。比如请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。但是如果这个图片是链接到其他站点的服务器上去了呢,比如在我项目中,我引用了的是淘宝中的一张图片的话,那么当我们网站重新加载的时候,就会请求淘宝的服务器,那么这就很有可能造成淘宝服务器负担。因此这个就是盗链行为。因此我们要实现防盗链。

    实现防盗链:使用http协议中请求头部的Referer头域来判断当前访问的网页或文件的源地址。通过该头域的值,我们可以检测访问目标资源的源地址。如果目标源地址不是我们自己站内的URL的话,那么这种情况下,我们采取阻止措施,实现防盗链。但是注意的是:Referer头域中的值是可以被更改的。因此该方法也不能完全安全阻止防盗链。

    使用Nginx服务器的Rewrite功能实现防盗链。

    Nginx中有一个指令 valid_referers. 该指令可以用来获取 Referer 头域中的值,并且根据该值的情况给 Nginx全局变量 $invalid_referer 赋值。如果Referer头域中没有符合 valid_referers指令的值的话,$invalid_referer变量将会赋值为1. valid_referers 指令基本语法如下:

    valid_referers  none | blocked | server_names | string

    none: 检测Referer头域不存在的情况。
    blocked: 检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况。那么在这种情况下,该头域的值不以"http://" 或 "https://" 开头。

    server_names: 设置一个或多个URL,检测Referer头域的值是否是URL中的某个。

    因此我们有了 valid_referers指令和$invalid_referer变量的话,我们就可以通过 Rewrite功能来实现防盗链。
    下面我们介绍两种方案:第一:根据请求资源的类型。第二:根据请求目录。

    1. 根据请求文件类型实现防盗链配置实列如下:

    server {
      listen 8080;
      server_name xxx.abc.com
      location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
        valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com  *.tabobao.com;
        if ($invalid_referer) {
          rewrite ^/ http://www.xxx.com/images/forbidden.png;
        }
      }
    }

    如上基本配置,当有网络连接对以 gif、jpg、png为后缀的图片资源时候、当有以swf、flv为后缀的媒体资源时、或以 rar、zip为后缀的压缩资源发起请求时,如果检测到Referer头域中没有符合 valid_referers指令的话,那么说明不是本站的资源请求。

    location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ 该配置的含义是 设置防盗链的文件类型。

    valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com; 可以理解为白名单,允许文件链出的域名白名单,如果请求的资源文件不是以这些域名开头的话,就说明请求的资源文件不是该域下的请求,因此可以判断它是盗链。因此如果不是该域下的请求,就会使用 Rewrite进行重定向到 http://www.xxx.com/images/forbidden.png 这个图片,比如这张图片是一个x或其他的标识,然后其他的网站就访问不了你这个图片哦。

    2. 根据请求目录实现防盗链的配置实列如下:

    server {
      listen 8080;
      server_name xxx.abc.com
      location /file/ {
        root /server/file/;
        valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com  *.tabobao.com;
        if ($invalid_referer) {
          rewrite ^/ http://www.xxx.com/images/forbidden.png;
        }
      }
    }