0

我现在在我的服务器上有直接指向文件的下载链接。我有一套相当复杂的重写规则,但它们不会影响我的要求。

我想做的是统计下载次数。我知道我可以编写一个 PHP 脚本来回显内容并使用重写规则,以便 PHP 脚本处理所有下载。

但是,有几点我很担心:

  1. 由于粗心或未被注意的错误,某些危险路径(例如/etc/passwd../../index.php)有可能不会被阻止
  2. 需要HTTP 404 Not Found在我更喜欢让 Apache 处理它们的脚本中处理响应(和其他)(我有一个依赖于服务器重定向变量的错误处理程序脚本)
  3. HTTP 标头(如内容类型或修改时间)可能未正确设置
  4. 使用 PHP 脚本通常不允许HTTP 304 Unmodified响应,因此浏览器缓存将毫无用处,并且重新下载会消耗额外的带宽实际上我可以检查一下,但需要更多的编码和调试。
  5. PHP 脚本比直接由 Apache 直接加载文件使用更多的处理能力

所以,我想找到一些其他的方法来执行统计。例如,当某些文件(在某些目录中)被请求和下载时,我可以让 Apache 触发脚本吗?

4

3 回答 3

0

您可以解析 Apache 日志文件。

于 2012-10-22T14:58:04.190 回答
0

Apache 的 mod_lua可能是将自己的代码挂钩到 apache 内部的请求处理中的最通用、灵活和有效的方法。通常,您会为提供最直接方法的任务选择该语言。lua 在与 c/c++ 交互方面比其他任何东西都要好得多。

但是当然还有其他策略,所以要有创意。我立刻想到两件事:

  • 如果您在某种类似 unix 的系统下,对 PAM 的一些创造性使用:配置某种虚拟身份验证要求并设置 PAM 进行处理。在 PAM 配置中,您可以为所欲为。优势:您收到请求,并且可以过滤自己要计算的内容和不可计算的内容。您必须确保 PAM 响应不会创建有效会话,以便您真正获得客户端完成的每个请求的滴答声,而不仅仅是第一个请求。

  • 还有其他允许进行请求处理的 apache 模块。看看取证模块外部过滤器模块。两者都允许将外部逻辑挂接到请求处理中。您将需要为此配置基于 cli 的 php。

于 2012-10-22T16:02:36.997 回答
0

这可能不是您正在寻找的东西,但本着使用正确工具完成工作的精神,您可以轻松使用 Google Analytics(或任何其他分析包)来跟踪它。看看https://support.google.com/analytics/bin/answer.py?hl=en-GB&answer=1136922

编辑:

它需要能够为您的站点修改 vhost 设置,但您可以为下载创建一个单独的 apache 日志文件。假设您有一个下载文件夹来存储可供下载的文件,您可以将类似这样的内容添加到您的虚拟主机中:

SetEnvIf Request_URI "^/downloads/.+$" download
LogFormat "%U" download-log
CustomLog download-tracking.log download-log env=download

现在,无论何时从 /downloads/ 文件夹请求某些内容,它都会记录在 download-tracking.log 文件中。

有几件事要知道:

  • 您可以根据需要拥有尽可能多的 SentEnvIf 行。只要他们都设置了下载环境变量,请求就会被记录到CustomLog
  • 我展示的 LogFormat 将仅记录请求的 URI,但您可以轻松自定义它以记录更多内容,而不仅仅是 URI,请参阅http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#logformat更多细节。
  • 如果您提供 PDF 文件,请注意某些浏览器/插件会对 PDF 的每一页发出单独的请求,因此您在阅读日志时需要考虑到这一点。

这种方法的主要好处是它不需要任何编码,只需一个简单的配置更改,你就可以开始了。当然,缺点是您必须进行某种日志处理。这仅取决于对您来说最重要的是什么。

另一种选择是使用 PHP 脚本和readfile函数。这使得将请求记录到数据库变得更加容易,但它确实伴随着您前面提到的其他问题。

有一些方法可以将 Apache 日志通过管道传输到 MySQL,但据我所知,这可能很棘手。取决于你在做什么,这可能是值得的……但话又说回来,它可能不会。

于 2012-10-23T06:25:40.913 回答