我们经常会看到在浏览某一图片时会弹出一“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就可以进去网站然后访问所有的内容了。
dao lian picture ///做一个链接,链接后端nginx静态服务器
[root@apache htdocs]# /usr/local/apache2/bin/apachectl -k restart ///重启apache,使配置生效。
现在可以在客户端浏览192.168.0.115测试了,见下图效果:
在客户端浏览器上输入网站前端apache的ip时出现了apache的主页,点击一下:
点击之后,浏览器正确的到后端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做了防盗链技术:
到这里,如果出现了盗用现象,我就给它弄了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的防盗链技术描述完成。