php 使用 apache 模块 mod-xsendfile 实现文件下载
编写apache 的重写文件 .htaccess, 重写的目的是为了和项目的区分开, 下载文件做单独的服务器, 这样就不会拖垮项目配置规则如下:
RewriteEngine on
RewriteRule index.html index.php
RewriteRule (.*.(rar|zip|chm))$ http://download.test/down.php?file=$1 [NC] // 将下载文件重定向到 http://download.test/download/ 的域名下面
获取请求的文件名称, 并判断是否有权限// 请求的文件名称为 localhost/abc.zip, .htaccess文件需要放置在 localhost 的域名下面, 才能实现重定向
$filename = basename($_GET['file']);
if (!is_file($filename) || !is_readable($filename)) {
exit("
没有找到文件
}
如果为中文, 设置中文的文件名称, 并获取浏览器的类型(不同的浏览器输出文件的格式不一致)header("content-type:applicaton/octet-stream");
$ua = $_SERVER['HTTP_USER_AGENT'];
$encodeName = urlencode($filename);
$encodeName = str_replace('+', '%20', $encodeName);
判断浏览器的类型, 并设置输出的 header头信息// 判断浏览器类型
if (preg_match('/MSIE/i', $ua)) {
// 微软的浏览器
header("Content-Disposition:attachment; filename='".$encodeName."'");
} else if (preg_match("/firefox/i", $ua)) {
/*火狐浏览器*/
header("Content-Disposition:attachment; filename*='utf8' '".$encodeName."'");
} else {
/*其他浏览器*/
header("Content-Disposition:attachment; filename='".$filename."'");
}
使用apache的mod-xsendfile模块加速下载文件// 如果服务器支持x-sendfilemodule 则使用x-sendfile加速下载
$xsendfilemodule = in_array('mod-xsendfile', apache_get_modules());
// headers_send() 检测header报头是否已经发送, 发送返回 true, 否则false
if (!headers_send() && $xsendfilemodule) {
header('x-Sendfile:'.$filename);
} else {
@readfile($filename);
}
最后贴上所有代码<?php
$filename = basename($_GET['file']);
if (!is_file($filename) || !is_readable($filename)) {
exit("
没有找到文件
}
header("content-type:applicaton/octet-stream");
$ua = $_SERVER['HTTP_USER_AGENT'];
$encodeName = urlencode($filename);
$encodeName = str_replace('+', '%20', $encodeName);
// 判断浏览器类型
if (preg_match('/MSIE/i', $ua)) {
// 微软的浏览器
header("Content-Disposition:attachment; filename='".$encodeName."'");
} else if (preg_match("/firefox/i", $ua)) {
/*火狐浏览器*/
header("Content-Disposition:attachment; filename*='utf8' '".$encodeName."'");
} else {
/*其他浏览器*/
header("Content-Disposition:attachment; filename='".$filename."'");
}
// 如果服务器支持x-sendfilemodule 则使用x-sendfile加速下载
$xsendfilemodule = in_array('mod-xsendfile', apache_get_modules());
// headers_send() 检测header报头是否已经发送, 发送返回 true, 否则false
if (!headers_send() && $xsendfilemodule) {
header('x-Sendfile:'.$filename);
} else {
@readfile($filename);
}
?>