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

Apache .htaccess和阻止特定文件扩展名的困难,apache,.htaccess,webserver,Apache,.htaccess,Webserver,我有一个相当复杂的情况,我运行一个个人博客,每个星期五和星期天,我都会将mp3上传到一个文件夹中,在那里一个Flash mp3播放器可以访问它并为全世界播放它,从而在博客上发布音乐 最近,有一个叫做Dizzler的网站,它就像一个蜘蛛,可以读取mp3文件(就像我在服务器上托管的文件!),让人们通过自己的专用播放器播放这些文件。现在,我通常不会反对其他人为了自己的利益而使用我的服务器,但这最近已经失控了。在12月的最后一周,他们成功地在一首歌曲上获得了100k的点击率,并使用了6GB的带宽 在12

我有一个相当复杂的情况,我运行一个个人博客,每个星期五和星期天,我都会将mp3上传到一个文件夹中,在那里一个Flash mp3播放器可以访问它并为全世界播放它,从而在博客上发布音乐

最近,有一个叫做Dizzler的网站,它就像一个蜘蛛,可以读取mp3文件(就像我在服务器上托管的文件!),让人们通过自己的专用播放器播放这些文件。现在,我通常不会反对其他人为了自己的利益而使用我的服务器,但这最近已经失控了。在12月的最后一周,他们成功地在一首歌曲上获得了100k的点击率,并使用了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中的一个条目,它将无法找到它。我的主机的解决方案是在每次安装的每个.htaccess文件和web服务器根目录的根目录中添加“RewriteEngine on”

这是一个伟大的修复,所有的网页再次工作-但它不再阻止我的mp3文件在该文件夹

我能做什么

另外,为了澄清,上面的代码位于包含MP3的文件夹中的.htaccess文件中。希望有帮助

是您需要的指令:

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

命令允许,拒绝
允许从本地主机#或播放机的地址
全盘否定

非常感谢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>
SetEnvIfNoCase Referer www\.dizzler\.com坏的\u Referer
设置环境定位参考“*(dizzler | beem3 | skreemr)。*”阻塞参考
SetEnvIfNoCase远程地址“*(220.181.38.82 | 202.108.23.172 | 66.232.150.219)。*”阻塞地址
#拒绝上面的任何匹配,并发送403拒绝
命令拒绝,允许
拒绝来自环境=错误的参考
拒绝来自env=BlockedReferer
拒绝来自env=BlockedAddress
今晚进行测试,如果有效,明天将报告

我认为我的另一个答案要好得多,但这仍然值得考虑

通过阅读其中一些答案,我被另一个想法打动了:让你的页面在过去两个小时(或多个小时)内记录所有网站访问者的IP地址。然后,创建一个作业,每隔2秒左右运行一次,该作业将重写.htaccess文件,以便只允许访问日志中那些IP地址的mp3文件


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

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

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

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

  • 更改MP3的路径。这是秘密
  • 创建一个脚本来代理MP3,这需要一个每小时更改一次的有效密钥
  • 将您对mp3播放器的所有使用更改为使用mp3代理脚本,但使用占位符键
  • 为您的Web服务器创建代理脚本,该脚本将用实际密钥替换密钥占位符
  • 使用
    .htaccess
    重写对服务器的所有请求,以使用webserver代理脚本
所有这一切的结果是,你的用户体验不会改变,但如果爬虫程序对你的链接进行爬网,它们将只在当天午夜前有效,此时对该url的请求将导致一条尖刻的消息(甚至是你的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.");
}

?>
<?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文件不太在行,所以我无法给出确切的代码,但我想这应该不会太难做到

恭喜,你完成了

免责声明:

请注意,此处的代码不是生产级别代码。首先,我根本没有测试过它——尽管除非在某个地方有拼写错误,否则它们都应该工作,我建议你在使用它们之前仔细阅读它们。我一直很小心,不让任何不好的事情发生,但它没有做任何认真的检查,而且现在是凌晨,所以我可能有