.htaccess和阻止特定文件扩展名的困难

时间:2010-01-03 14:36:28

标签: apache .htaccess webserver

我有一个相当复杂的情况,我在每个星期五和星期日运行一个个人博客,我会通过将mp3上传到一个文件夹来在博客上发布音乐,Flash MP3播放器访问它并为世界播放它

最近,一些名为Dizzler的网站,就像是MP3文件的蜘蛛(就像我在服务器上托管的那些!),让人们通过他们自己的专有播放器播放它们。现在,我通常不会反对其他人使用我的服务器为自己的利益,但这最近失控。在12月的最后一周,他们设法在一首歌曲中获得了10万次点击,并消耗了6GB的带宽。

在12月的最后一周,我编辑了我的.htaccess文件以删除对我服务器上的mp3的访问,而无需访问我的mp3(所以“拒绝所有”不是一个选项!)我使用了这段代码:

RewriteEngine on
RewriteCond %{HTTP_REFERER} .
RewriteCond %{HTTP_REFERER} !^(www\.)?mydomain.com [NC]
RewriteRule \.(mp3)$ - [NC,F] 

Options -Indexes

它有一个例外 - 它打破了我服务器上的每个Wordpress安装。我的意思是在索引页面之外,如果你点击Wordpress中的一个条目,它将无法找到它。我的主机的解决方案是在每个安装和web服务器根目录的根目录中为每个.htaccess文件添加“RewriteEngine on”。

这是一个很好的解决方案,所有页面都可以再次运行 - 但它不再阻止我在该文件夹中的mp3文件。

我该怎么办?

PS。为了澄清,上面的代码位于包含mp3的文件夹中的.htaccess文件中。希望有所帮助!

4 个答案:

答案 0 :(得分:2)

非常感谢Vinko Vrsalovic提供的所有帮助,肯定帮助我指出了正确的方向,目前正在使用以下代码:

SetEnvIfNoCase Referer www\.dizzler\.com bad_referer
SetEnvIfNoCase Referer ".*(dizzler|beemp3|skreemr).*" BlockedReferer
SetEnvIfNoCase REMOTE_ADDR ".*(220.181.38.82|202.108.23.172|66.232.150.219).*" BlockedAddress

# deny any matches from above and send a 403 denied
<FilesMatch "\.mp3$">
    order deny,allow
    deny from env=bad_referer
    deny from env=BlockedReferer
    deny from env=BlockedAddress
</FilesMatch>

今晚测试一下,明天会报告它是否有效!

答案 1 :(得分:1)

FilesMatch是您需要的指令:

<FilesMatch "\.mp3$">
    Order Allow, Deny
    Allow from localhost #Or the address of your player
    Deny From All
</FilesMatch>

答案 2 :(得分:1)

我将此作为另一个答案发布,而不是将其添加到我的其他帖子中,因为它从不同的角度解决了问题。在这里,我假设你的所有mp3都在同一个文件夹中。

你面临的问题是由于编写了wordpress所使用的媒体播放器的人的编码草率。发生的事情是玩家在访问用户的机器上运行,并实际下载mp3并在本地播放。问题出现是因为播放器根本没有提供任何有用的标题:useragent是你的浏览器,引用者是空白等等。因此,完全不可能判断请求是否是来自播放器,或来自在音频搜索引擎中点击链接的浏览器。实际上,保护mp3不被索引的唯一方法是尽可能频繁地更改链接。

这正是计划。简而言之,以下是我们要做的事情:

  • 更改mp3的路径。这就是SECRET。
  • 创建一个代理mp3的脚本,这需要一个每小时更改一次的有效密钥
  • 更改您对mp3播放器的所有使用,以使用mp3代理脚本,但使用占位符键
  • 创建一个脚本来代理您的网络服务器,用一个实际的密钥替换密钥占位符
  • 使用.htaccess重写对服务器的所有请求以使用网络服务器代理脚本。

所有这一切的结果是您的用户体验不会改变,但如果抓取工具抓取您的链接,它们只会在当天午夜有效,此时对该网址的请求将产生一条狡猾的消息(或者甚至是你要求他们不要下载你的东西的mp3)。

准备好了吗?好的,我们走吧!


第1步:

首先,确保重命名了mp3文件夹!这将破坏所有现有链接(并且未执行此操作将意味着已爬网的所有链接将保持有效)。其次,创建一个robots.txt文件,以阻止谷歌和其他搜索引擎索引您的mp3文件夹。

现在,在名为mp3serve.php的根目录中创建一个文件,其中包含以下内容:

<?php

/* This script checks 'key', and if it's valid, serves the mp3
 * A valid key is defined as the md5 of the current date in
 * yyyy-mm-dd-hh format concatenated with the string
 * "Hello there :)"
 *
 * The key can be anything so long as we are consistent in this
 * and the viewer proxy thing we're going to make.
 */

// edit this variable to reflect your server
$music_folder = "/new/path/to/mp3s/";

// get inputs of 'file' and 'key'
// 'file' should be the filename of the mp3 WITHOUT the extension
$file = $_GET['file'];
$key  = $_GET['key'];

// get todays date
$date = date("Y-m-d-H");

// calculate the valid key
$valid = md5($date+"Hello there :)");

if ($key == $valid)
{
    // if the key is valid, get the song in the path:
    print(file_get_contents("$music_folder/$file.mp3"));
}
else
{
    // if the key is invalid, print an admonishing message:
    print("Please don't try to download my songs, poopface.");
}

?>

这样做需要MP3的文件名和某种密钥,如果密钥有效,则提供文件内容。请注意,此脚本:

  • 根本没有检查$file指向你的预期,除了它试图确保它只会返回mp3文件这一事实。
  • 不返回mp3文件的有效标题 - 它们将在浏览器中呈现为文本。这很容易解决,但正确的标题暂时没有我...而且无论如何wordpress mp3播放器都不关心,所以这一切都很好:)

第2步:

现在有点棘手的部分:我们必须动态重写链接。最简单的方法是编写一个“本地代理”的东西,这听起来比听起来容易得多。我们要做的是编写一个脚本来获取您的页面输出的内容并更正mp3链接。在我的例子中,我们将编辑所有带有mp3的文章,但是如果你想获得幻想,这不是完全必要的。

首先,使用其中的mp3播放器编辑所有文章。您可以自动执行此操作,但除非WP具有“查找/替换所有文章”功能,否则我会建议您反对它,原因可能是您可能搞砸并销毁您的文章。在任何情况下,编辑它们并替换播放器中的mp3链接 /path/to/mp3s/<filename>.mp3

/mp3serve.php?file=<filename>&key=[{mp3_file_key}]

现在,在名为proxyviewer.php的根目录中创建另一个php脚本,其中包含以下内容:

<?php

/*
 * The purpose of this file is to act as a proxy in which we can dynamically
 * rewrite the page contents. Specifically, we want to get the page that the
 * user WOULD have seen, and replace all instances of our key placeholder
 * with the actual correct key
 */

// get the requested path
$request = $_GET['req'];

// get what the source output WOULD have been
// NOTE: depending on your server's config, you -might- have to
//   replace 'localhost' with your actual site-name. This will
//   however increase page-load times. If localhost doesn't work
//   ask your host how to access your site locally. To clarify,
//   maybe show him this file.
$source = file_get_contents("http://localhost/$request");

// The reason we need to pass the request through apache (i.e. use the whole
// "http://localhost/" thing is because we need the PHP to be rendered, and
// I can't think of another way to do that using the original request uri

// calculate the correct key
$key = md5(date("Y-m-d-H")+"Hello there :)");

// replace all instances of "[{mp3_file_key}]" with the key
$output = str_replace("[{mp3_file_key}]",$key,$source);

//output the source
print($output);

?>

第3步:

现在为最后一部分:设置.htaccess文件以重定向来自的所有请求 http://yoursite/some/request/here

http://yoursite/proxyviewer.php?req=some/request/here

不幸的是我对.htaccess文件真的不太好,所以我无法给你确切的代码,但我想这不应该太难。

恭喜,你已经完成了!

声明:

请注意,此处的代码不是生产级代码。首先,我根本没有对它进行过测试 - 虽然除非在某个地方出现错字,否则我会建议你仔细查看它们然后才能使用它们。我一直非常小心,不允许任何坏事发生,但它没有做任何严肃的检查,这是早上的凌晨,所以我可能忽略了一些事情。

答案 3 :(得分:0)

我认为我的其他答案要好得多,但这仍然值得考虑

通过阅读一些答案,我对另一个想法感到震惊:让您的页面在过去两小时(或多个小时)内记录您网站所有访问者的IP地址。然后,创建一个运行2秒左右的作业,它会重写.htaccess文件,只允许将mp3文件访问日志中的那些IP地址。

这样,只有在过去两小时内从您的网站投放过网页的用户才能访问您的音乐。对于绝大多数在音频搜索引擎中找到你的mp3的人来说,这将被证明是错误的。