2026-10-21 12:34:30
使用 Apache mod_rewrite 实现文件下载追踪与统计的核心方法是通过 .htaccess 文件配置 URL 重写规则,将直接文件访问请求重定向至 PHP 追踪脚本(如 download.php),从而记录下载信息并返回文件。
具体实现步骤1. 准备工作确认服务器环境:
使用 Apache 服务器。
启用 mod_rewrite 模块:
Debian/Ubuntu:运行 sudo a2enmod rewrite。
其他系统:在 httpd.conf 中取消注释 LoadModule rewrite_module modules/mod_rewrite.so。
确保目标目录的 Apache 配置中包含 AllowOverride All(在 <Directory> 或 <VirtualHost> 块内),以使 .htaccess 生效。
编写 PHP 追踪脚本:
示例脚本 download.php 需实现以下功能:
接收文件名参数(如 ?file=document.pdf)。
验证文件名合法性(防止路径遍历攻击)。
记录下载信息(如 IP、时间、文件名)至日志文件。
返回文件内容给用户。
关键代码逻辑:<?phpif (isset($_GET['file'])) { $fileName = basename($_GET['file']); // 防止路径遍历 $filePath = __DIR__ . '/' . $fileName; // 调整路径以匹配实际文件位置 if (file_exists($filePath)) { // 记录日志 $logMessage = date('Y-m-d H:i:s') . " - Downloaded: " . $fileName . " by IP: " . $_SERVER['REMOTE_ADDR'] . "n"; file_put_contents('downloads.log', $logMessage, FILE_APPEND); // 发送文件 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $fileName . '"'); header('Content-Length: ' . filesize($filePath)); readfile($filePath); exit; } else { header("HTTP/1.0 404 Not Found"); echo "File not found."; exit; }} else { header("HTTP/1.0 400 Bad Request"); echo "File parameter missing."; exit;}?>
在文件下载目录(如 /files/)下创建或编辑 .htaccess 文件,添加以下规则:
基础规则(匹配特定文件名):
RewriteEngine OnRewriteBase /files/RewriteRule ^(.+(file|FILE))$ download.php?file=$1 [L]匹配以 file 或 FILE 结尾的 URL(如 /files/myfile → /files/download.php?file=myfile)。
通用规则(匹配所有带扩展名的文件):
RewriteRule ^([^/]+.[a-zA-Z0-9]+)$ download.php?file=$1 [L]匹配如 /files/document.pdf 或 /files/archive.zip 的请求。
严格规则(排除目录和脚本自身):
RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_URI} !^/files/download.phpRewriteRule ^(.+)$ download.php?file=$1 [L]确保仅重写实际文件请求,避免重复处理 download.php。
直接访问文件:
尝试通过浏览器访问 /files/document.pdf(根据规则调整 URL)。
确认请求被重定向至 download.php,且文件正常下载。
检查日志:
查看 downloads.log 是否记录了下载信息(如 IP、文件名、时间)。
安全性:
严格验证 $_GET['file'],避免路径遍历攻击(如 ../etc/passwd)。
使用 basename() 或白名单验证文件名。
性能优化:
高流量网站建议将重写规则移至 Apache 主配置文件(如 httpd.conf),减少 .htaccess 解析开销。
缓存控制:
在 download.php 中设置 Cache-Control 和 Expires 头,优化重复下载性能。
错误处理:
文件不存在时返回 404,参数缺失时返回 400。
通过 mod_rewrite 重写规则和 PHP 脚本的配合,可实现文件下载的追踪与统计。关键点包括: