我们经常会看到在浏览某一图片时会弹出一“403权限禁止”错误,这说明有可能正在浏览的这个网站用到的图片在盗用别的网站图片,而被盗用的网站采用了防盗链技术。那么怎样才能不让自己的网站受害呢?

    这里讲述的是nginx防盗链技术,是nginx。nginx的具体安装以及相关的优化在这里不多说了。我用一台nginx服务器模拟后端服务器,这台nginx主要用作图片、gif、swf等静态服务器(会在这台服务器上对这些静态文件做防盗链技术),ip地址为192.168.0.116;又用了一台apache服务器作为前端服务器(用apache做前端不是好的选择,一般都会用nginx做前端,但我这里只是为了模拟,这里的前端服务器仅仅提供一个简单的主页界面而已),ip地址为192.168.0.115。

    在nginx服务器上面的操作:

[root@nginx conf]# cat nginx.conf    ///nginx的主配置文件

user  nobody;

worker_processes  1;


pid        logs/nginx.pid;


events {

    worker_connections  65535;

    use epoll;

}


http {

    include       mime.types;

    default_type  application/octet-stream;


    sendfile        on;

    keepalive_timeout  65;


    gzip  on;


    include extra/daolian.conf;    ///我把防盗链技术配置文件独立出来了,这只是一个习惯而已,可以不把配置文件独立出来而是把它们全部放到nginx.conf的http节点里面。

}

   

root@nginx extra]# cat daolian.conf     ///防盗链的具体配置文件放在了/usr/local/nginx/conf/extra目录下面。

server {

    listen 80;

    server_name 192.168.0.116;    ///被访问的域名


    location ~*.(gif|jpg|png|swf|flv)$ {    ///定义对gif/jpg/png/swf/flv等静态页面进行防盗

root /usr/local/nginx/html;    ///指定上述静态页面放在的位置

valid_referers none blocked 192.168.0.115;    ///指定哪个域名可以访问本静态服务器,也可以是ip地址,这里我指定的是192.168.0.115,也就是内部的前端apache服务器,只允许这台访问。

if ($invalid_referer) {

   return 403;    ///如果有其他机器访问这台nginx服务器就会给那台机器返回一个403访问禁止的页面,也就是说如果出现了盗用现象就提示403错误。

}

    }

}


然后在/usr/local/nginx/html目录下放一张0.jpg的照片作为测试用(因为这台nginx服务器就是用来做后端静态服务器用的,放这张照片仅模拟gif、jpg、swf等诸多静态页面。

 

[root@nginx extra]# /usr/local/nginx/sbin/nginx -s reload    ///重启nginx服务器,使配置文件生效。

到这里nginx服务器的配置完成,下面对apache服务器进行配置:

[root@apache htdocs]# cat index.html    ///我在apache服务器的/usr/local/apache2/htdocs目录下创建这个主页,作为远端客户访问本网站的入口用,即远在天涯海角的客户端要想访问本网站的内容只需要访问192.168.0.115就可以进去网站然后访问所有的内容了。

fang dao lian test

dao lian picture  ///做一个链接,链接后端nginx静态服务器




[root@apache htdocs]# /usr/local/apache2/bin/apachectl -k restart    ///重启apache,使配置生效。


现在可以在客户端浏览192.168.0.115测试了,见下图效果:

nginx防盗链_第1张图片

在客户端浏览器上输入网站前端apache的ip时出现了apache的主页,点击一下:nginx防盗链_第2张图片

点击之后,浏览器正确的到后端nginx服务器找到了需要的照片,浏览器中的域名也随之变成了192.168.0.116,这表示内部的跳转成功了。分别分析两台服务器的访问日志也能发现有人访问了。


    下面做一次,假设本网站的前端服务器域名是www.xiaowei.com,不是192.168.0.115了,即192.168.0.115是其他公司的网站服务器,当有人访问其他公司的那个192.168.0.115服务器时,而这台服务器还想着要来到192.168.0.116这台nginx服务器上面调用0.jpg这张照片,同时192.168.0.116这台服务器做了盗链技术,192.168.0.116只允许www.xiaowei.com这个自己的域名访问,其他公司的ip若要访问时就视为盗用然后返回一个错误值,具体做法如下:    

[root@nginx extra]# cat daolian.conf     ///只需要修改这个配置文件就行啦

server {

    listen 80;

    server_name 192.168.0.116;


    location ~*.(gif|jpg|png|swf|flv)$ {

root /usr/local/nginx/html;

valid_referers none blocked www.xiaowei.com;    ///只需要将这里的域名修改成www.xiaowei.com就可以啦,其他配置其他文件都不需要修改

if ($invalid_referer) {

   return 403;

}

    }

}


[root@nginx extra]# /usr/local/nginx/sbin/nginx -s reload

再次在客户端上访问192.168.0.115,再次点击链接时,发现弹出了403访问禁止权限,见下图,因为这里的”陌生“的服务器192.168.0.115盗用了192.168.0.116,而192.168.0.116做了防盗链技术:

nginx防盗链_第3张图片

    到这里,如果出现了盗用现象,我就给它弄了403访问禁止的页面,可不可以把它直接跳到自己网站的主页呢?当然可以了,假设我的网站的默认主页是www.hfuu.edu.cn,如果出现了盗用现象,那么客户端那面随之就会看到www.hfuu.edu.cn这个主页,做法如下:    

[root@nginx extra]# cat daolian.conf 

server {

    listen 80;

    server_name 192.168.0.116;


    location ~*.(gif|jpg|png|swf|flv)$ {

root /usr/local/nginx/html;

valid_referers none blocked www.xiaowei.com;    ///这一行仍旧设置成只允许自己的域名访问

if ($invalid_referer) {

#    return 403;

   rewrite ^.*$ http://www.hfuu.edu.cn;    ///如果出现了盗用,就直接把用户的访问转到了自己的主页,这样做不仅避免了盗用,也增加了自己的pv。

}

    }

}

[root@nginx extra]# /usr/local/nginx/sbin/nginx -s reload

客户端再次访问,点击链接时,发现浏览器自动跳转到了”自己的网站主页“www.hfuu.edu.cn,见下图:    

nginx防盗链_第4张图片

这表明如果出现了盗链,用户访问会成功跳转到其他页面。


到这里,nginx的防盗链技术描述完成。