下载是 常用的功能,最近做一个带有扣除积分功能的下载模块~
为了保证性能和考虑到服务器压力决定使用mod_xsendfile 模块进行下载
1、下载模块 mod_xsendfile.c 下载的地址 https://tn123.org/mod_xsendfile/
2、mod_xsendfile.c 文件需要重新编译
将下载的 mod_xsendfile.c 复制到 /usr/local/apache2/bin/ 目录下 然后使用apxs进行编译
/usr/local/apache2/bin/apxs -i -c -a mod_xsendfile.c
备注:apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态 共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。
3、 在apache配置文件中进入模块并增加配置文件上传的权限目录
vim /usr/local/apache2/etc/http.conf
4、载入模块+配置上传的目录
LoadModule xsendfile_module modules/mod_xsendfile.so
<IfModule mod_xsendfile.c>
XsendFile on
XsendFilePath /usr/local/apache2/htdocs/rar
</IfModule>
置问重新启动apache 至此mod_xsendfile已将模块安装完毕
4、在php中调用
header('X-Sendfile:'.$file);
例子:
<?php
$file = 'test.zip';
$filename = '中文.zip';
if(file_exists($file)){
$user_agent = $_SERVER['Http_User_agent'];
$encode_filename = rawurlencode($filename);
if(preg_match("/MSIE/", $user_agent)){
header('content-disposition:attachment; filename="'.$encode_filename.'"');
}else if(preg_match("/Firefox/", $user_agent)){
header("content-disposition:attachment; filename*=\"utf8''".$filename.'"');
}else{
header('content-disposition:attachment; filename="'.$filename.'"');
}
header('X-Sendfile:'.$file);
}
?>
同时可以结合apache 对目录权限禁止外部访问,保证了安全
在apache配置文件中加入如下代码
<Directory /usr/local/apache2/htdocs/rar>
Order Deny,Allow
Deny from all
</Directory>
php实现会员扣除积分的下载的整体思路
下载页面传递 下载的文件名称(不能通过传递路径暴露真是路径)
通过session判断是否登录如果未登录跳转登录页面
登录查询数据库获取用户信息 以及权限 通过xsendfile 下载 扣除用户积分