RewriteRule和php下载计数器

时间:2010-05-13 04:29:28

标签: apache mod-rewrite

(1)我有一个提供MP3文件的网站:

http://domain/files/1234567890.mp3

(2)我有一个跟踪文件下载次数的php脚本:

http://domain/modules/download_counter.php?file=/files/1234567890.mp3

在download_counter.php记录下载后,它会重定向到原始文件: 标题(“位置:$ FQDN_url”);

(3)我希望所有公共链接都显示为(1)中的直接文件URL。我正在尝试使用Apache将请求重定向到download_counter.php:

RewriteRule ^files/(.+\.mp3)$ /modules/download_counter.php?file=/files/$1 [L]

我目前停留在(3),因为它导致重定向循环,因为download_counter.php只是将请求重定向回原始文件(而不是流式传输文件内容)。

我也有动力按原样使用download_counter.php(不修改它的重定向行为)。这是因为该脚本是较大CMS模块的一部分,我想避免使升级路径复杂化。

也许我的问题没有解决方案(除了修改download_counter脚本)。 WDYT?

4 个答案:

答案 0 :(得分:1)

如果这不是有史以来最强大的保护(我可以看到,它不是),那么只需让你的脚本将浏览器重定向到文件,而不是

http://domain/files/1234567890.mp3/redirected

确保您的网络服务器仍然可以正确地提供此类请求作为文件下载。如果它会,那么只需添加负面的RewriteCond,这将确保当且仅当链接未以/重定向结束时才进行重定向

答案 1 :(得分:1)

更新的答案

我认为你遇到了很多麻烦,因为你的伪网址实际上是真正的网址:它们会导致文件。因此,您应该将伪URL更改为domain.com/downloads/file.mp3之类的内容,然后检查所请求的文件是否不存在,以便重定向不会循环。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^downloads/(.+\.mp3)$ /modules/download_counter.php?file=/files/$1 [L]

答案 2 :(得分:0)

我首先想到的是使用referer的东西会起作用:

RewriteCond %{HTTP_REFERER} !download_conter\.php
RewriteCond %{HTTP_REFERER} !=""
RewriteRule ^files/(.+\.mp3)$ /modules/download_counter.php?file=/files/$1 [L]

但是,浏览器不合作。假设您单击file.html中的某个链接到something.mp3,然后转发到download_counter.php。当php脚本执行转发时,它设置为referer而不是download_counter.php而是file.html。

我看到你能做到这一点的唯一方法就是使用外部重写程序来保持某种状态 - 用户第一次请求文件时它会保存该信息并进行重写,第二次它会知道它首先进行了重写,并且未经修改就会通过请求。请参阅RewriteMap的文档。

答案 3 :(得分:0)

放入http://domain/files/这个.htaccess文件...

RewriteEngine On
RewriteOptions Inherit
RewriteRule ^(.*).(mp3)$ /modules/download_counter.php?file=$1.$2 [R,L]

这应该可以解决问题...