小樱 发表于 2021/7/13 04:36

用kangle实现discuz附件x-accel-redirect下载教程

对文件下载的权限进行精确控制在很多地方都需要,例如有偿的下载服务、网络硬盘、个人相册、防止本站内容被外站盗链等。

已知的一些方法有以下几种:
1、通过webserver的rewrite来经常改变下载文件的URL;
2、对HTTP请求的referer头进行判断,要求其必须来自指定的URL;
3、由cgi程序来做权限检查,然后open文件,返回给client;
4、就是本文所说的使用kangle的X-Accel-Redirect方法了(用法和nginx一样,lightty也有对应的X-sendfile来完成相同的功能)。
方法1的问题是URL经常变化,且为了防止URL被猜到,要经常的插入一些随机的长字符,造成URL冗长,非常不优雅;
方法2是不可靠的,因为 Referer头是由client发出的,完全可以伪造;
方法3,因为是由cgi程序打开并读取文件,所以在下载过程中需要持续占用一个cgi进程(线程),并且由于cgi的脚本语言IO速度一般比较慢,导致其总体效率低下。
方法5是我目前认为比较 优雅 的方式, 全面 解决此问题的方法。

我们来看整个过程:
步骤1、client请求http://downloaddomain.com/download/my.iso,此请求被CGI程序或者其它扩展解析。
步骤2、CGI程序根据访问者的身份和所请求的资源其是否有下载权限来判定是否有打开的权限。如果有,那么根据此请求得到对应文件的磁盘存放路径,例如是 /var/data/my.iso。那么程序返回时在HTTP header加入
X-Accel-Redirect: /protectfile/data/my.iso

,并加上head
Content-Type: application/octet-stream

步骤3、kangle得到cgi程序的回应后发现带有X-Accel-Redirect的header,那么根据这个头记录的路径信息打开磁盘文件,并关闭cgi程序有关资源,如关闭连接。
步骤4、kangle把打开文件的内容返回给client端。
这样所有的权限检查都可以在步骤1内完成,而且cgi返回带X-Accel-Redirect的头后,其执行已经终止,剩下的传输文件的工作由kangle来接管,同时X-Accel-Redirect头的信息被kangle删除,也隐藏了文件实际存储目录,并且由于kangle在打开静态文件上使用了异步操作,并且有缓存机制 ,其IO效率非常高。

Discuz论坛附件也可以支持x-accel-redirect方式下载,其效率提高非常明显。

操作步骤:

第一、安装discuz论坛后找到目录里的配置文件config\config_global.php


找到CONFIG DOWNLOAD,修改并保存。如下:

// -------------------------CONFIG DOWNLOAD-------------------------- //
$_config['download']['readmod'] = 2;
$_config['download']['xsendfile']['type'] = '1';
$_config['download']['xsendfile']['dir'] = '/down/';


第二   登录kangle的3311管理后台点左边的虚拟主机,如图:


在出现的界面上,选择需要设置的空间用户名:


接着点击别名:


如图所示:

url路径输入:
/down/

文件/目录:
网站主目录/data/attachment/forum/

如本例中的: C:\home\ftp\d\discuz\wwwroot\data\attachment\forum\
C:\home\ftp\d\discuz\wwwroot\ 为网站主目录,如果附件下载是在其它目录以实际地址为准
内部处:要打上勾
设置完成,点击“增加”

设置成功后,如果有用户下载附件,“命中次数”会显示命中次数

不可名 发表于 2021/7/19 08:04

{:3038:}{:3016:}{:3027:}
页: [1]
查看完整版本: 用kangle实现discuz附件x-accel-redirect下载教程