nginx下的文件下载防盗链(HttpAccessKeyModule)

本着节约带宽、权限下载的原则,寻觅下载防盗链技术。

一、“referers”方式检测来路

location ~* .(gif|jpg|png|swf|flv)$
{
valid_referers none blocked *.eact.com.cn;
if ($invalid_referer)
{
return 403;
}
}

仅适用于图片防盗链。现在的大部分下载软件都可以模拟构建来路,其他网站的盗链仍然无法避免。

 

二、php-mysql-odbc-ftp方式

让serv-u的ini配置文件通过odbc与数据库连接,php程序分配临时口令-ftp服务器通过数据库验证下载权限,提供ftp下载服务。

1、优点:

可以有效控制有效期、线程限制、速度限制。基本能够满足需求。本站曾经采取过此方式提供下载

2、缺点

依赖ftp服务器、数据库和他们的通信,频繁操作数据库,易引起故障。

三、php流式输出

由php读取文件,通过验证后使用web server 支持的 sendfile 方式进行流式输出。

1、优点

能够有效控制有效期、权限和速度,很多网站论坛、开源社区都采用此方式。

2、缺点

不能支持断点续传;服务器php模块处理带来一定的硬件消耗;当文件服务器为纯静态时时维护很麻烦。

四、使用web server 防盗链模块

使用nginx的第三方模块Http-Access-Key

这个模块可以阻止所有URL中未包含合法访问令牌的访问(防盗链)。访问令牌可以由访问者IP或者其它服务器变量生成,所以可以很好地控制客户端的下载行为。

用户得到的下载地址可能像这样: http://example.com/download/file.zip?key=09093abeac094

1、下载、解压

wget http://wiki.nginx.org/File:Nginx-accesskey-2.0.3.tar.gz

tar zxvf Nginx-accesskey-2.0.3.tar.gz

2、安装

然后编辑 “config” 文件,将 “$HTTP_ACCESSKEY_MODULE” 用 “ngx_http_accesskey_module” 替换。然后编译:

./configure --add-module=path/to/nginx-accesskey

3、配置

修改nginx.conf

location /download {

accesskey             on;

accesskey_hashmethod  md5;

accesskey_arg         "key";

accesskey_signature   "mypass$remote_addr";

}

php端:

 // some code
$url = $filePath.'?'.md5($mypass.$_SERVER['REMOTE_ADDR']);

完成,可以使用了


注:lighttpd也有相应模块,并能进行通过时间戳的有效期验证

参考资料:http://wiki.nginx.org/NginxChsHttpAccessKeyModule

五、珍爱带宽,远离迅雷

让 nginx 防止迅雷、快车的多线程下载:

作用域: server location

if ($http_range)
{
return 405;
}

这样给用户端的第二个线程返回405,只让nginx单线程给用户吐数据。没搜到说明,只是网上的一个帖子~

转:http://itthinker.vicp.net/?p=37

原文地址:https://www.cnblogs.com/shuaixf/p/2249080.html