设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 136|回复: 1

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

[复制链接]
 成长值: 27700

签到天数: 3587 天

[LV.Master]伴坛终老

发表于 2021/7/13 04:36 | 显示全部楼层 |阅读模式 |Google Chrome 91.0.4472.124|Windows 10
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
对文件下载的权限进行精确控制在很多地方都需要,例如有偿的下载服务、网络硬盘、个人相册、防止本站内容被外站盗链等。

已知的一些方法有以下几种:
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加入
  1. X-Accel-Redirect: /protectfile/data/my.iso
复制代码


,并加上head
  1. 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,修改并保存。如下:

  1. // -------------------------  CONFIG DOWNLOAD  -------------------------- //
  2. $_config['download']['readmod'] = 2;
  3. $_config['download']['xsendfile']['type'] = '1';
  4. $_config['download']['xsendfile']['dir'] = '/down/';
复制代码



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


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


接着点击别名:


如图所示:

url路径输入:
  1. /down/
复制代码


文件/目录:
  1. 网站主目录/data/attachment/forum/
复制代码


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

设置成功后,如果有用户下载附件,“命中次数”会显示命中次数
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

签到天数: 1073 天

[LV.10]以坛为家III

发表于 2021/7/19 08:04 | 显示全部楼层 |Google Chrome 91.0.4472.124|Windows 10
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2021/10/29 01:59 , Processed in 0.169119 second(s), 19 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表