没有`echo file_get_contents($ file)`计算下载次数?

时间:2012-10-22 14:55:10

标签: php apache mod-rewrite download

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

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

然而,我担心有几点:

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

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

3 个答案:

答案 0 :(得分:0)

您可以解析Apache日志文件。

答案 1 :(得分:0)

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

然而,当然还有其他策略,所以要有创意。我立即想到了两件事:

  • 如果您使用某种类似unix的系统,可以使用PAM:配置某种虚拟身份验证要求并设置PAM进行处理。在PAM配置中,您可以做任何您喜欢的事情。优点:您可以获得请求,并可以过滤自己的重点和不重要的内容。您必须确保PAM响应不会创建有效的会话,这样您才能真正得到客户端所做的每个请求,而不仅仅是第一个请求。

  • 还有其他apache模块可以进行请求处理。请查看forensic moduleexternal filter module。两者都允许将外部逻辑挂钩到请求处理中。您将需要为此配置基于cli的php。

答案 2 :(得分:0)

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

编辑:

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

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,但是从我看到它可能会很棘手。根据你正在做的事情,这可能是值得的努力......但是,它可能不会。