Nginx利用Secure Link进行文件下载防盗链

目的简介:

现在越来越多的博客,资源站因为各种因素,都开始纷纷搭建属于自己的下载服务器,但是这就造成了一个问题,盗链现象越来越严重。那么我们今天就来说说如何实现利用Nginx底层实现防盗链。

实战方法:

1.首先,需要Nginx编译的时候支持 secure link 这个就不多说了。(以下为宝塔 的编译方法)

宝塔在默认编译nginx后,会保留源码,及必要的模块源码(如ngx_cache_purge),所以编译时无需再次下载
默认安装脚本:/www/server/panel/install/nginx.shnginx
源码目录:/www/server/nginx/src/
cd /www/server/nginx/src/
./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt="-Wl,-E" --with-http_secure_link_module
make
rm -f /www/server/nginx/sbin/nginx.old
mv /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.old
cp objs/nginx /www/server/nginx/sbin/nginx
make upgrade

upgrade 完毕后,使用 nginx -V 命令 再次查看版本信息。

2.在下载服务器的Nginx配置文件中,最后放上,如下代码:

#防盗链
location / {
#limit_conn addr 1;
#limit_conn perip 1;
 #limit_conn perserver 100;

secure_link $arg_st,$arg_e;
secure_link_md5 这是随机字符替换$uri$arg_e;

if ($secure_link = "") {
   return 403;
        }

if ($secure_link = "0") {
    return 403;
    }
 }
    access_log  /www/wwwlogs/xz.cn.down.qkeke.com.log;
    error_log  /www/wwwlogs/xz.cn.down.qkeke.com.error.log;

3.在下载服务器根目录放上文件:

<?php
$host='test.qkeke.com';
$secret = '这是随机字符替换'; # 密钥
$path = $_GET['file']; # 下载文件
if(empty($path))
{
	echo '非法请求!';
	exit();
}
# 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
 $expire = time()+300;
# 用文件路径、密钥、过期时间生成加密串
 $md5 = base64_encode(md5($secret .'/'.$path . $expire, true));
 $md5 = strtr($md5, '+/', '-_');
 $md5 = str_replace('=', '', $md5);
# 加密后的下载地址
$link='https://'.$host.'/'.$path.'?st='.$md5.'&e='.$expire;
 echo '<a href='.$link.'>test</a>';
 echo '<br/>'.$link;
header("Refresh:3;url=".$link);
 ?>

 

THE END