Apache mod_rewrite 实现文件下载追踪与统计

Apache mod_rewrite 实现文件下载追踪与统计
最新回答
骑猪Δ追阳光

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;}?>

2. 配置 .htaccess 重写规则

在文件下载目录(如 /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。

3. 测试与验证
  • 直接访问文件:

    尝试通过浏览器访问 /files/document.pdf(根据规则调整 URL)。

    确认请求被重定向至 download.php,且文件正常下载。

  • 检查日志:

    查看 downloads.log 是否记录了下载信息(如 IP、文件名、时间)。

4. 注意事项
  • 安全性:

    严格验证 $_GET['file'],避免路径遍历攻击(如 ../etc/passwd)。

    使用 basename() 或白名单验证文件名。

  • 性能优化:

    高流量网站建议将重写规则移至 Apache 主配置文件(如 httpd.conf),减少 .htaccess 解析开销。

  • 缓存控制:

    在 download.php 中设置 Cache-Control 和 Expires 头,优化重复下载性能。

  • 错误处理:

    文件不存在时返回 404,参数缺失时返回 400。

总结

通过 mod_rewrite 重写规则和 PHP 脚本的配合,可实现文件下载的追踪与统计。关键点包括:

  • 正确配置 Apache 和 .htaccess。
  • 编写安全的 PHP 脚本处理文件验证与日志记录。
  • 根据实际需求调整重写规则(如匹配特定文件或通用扩展名)。
  • 关注安全性、性能和错误处理,确保系统稳定运行。