4

我正被试图关闭我的网站的机器人和恶意用户摧毁。

我尝试通过将所有对 mp3 文件的请求 mod_rewriting 到一个 php 脚本来制作带宽限制器,该脚本将跟踪每个 ip 并限制每个每小时可以下载多少。这工作得很好,但它给一些用户带来了很多问题,即链接不是指向 mp3 文件的直接链接。

我尝试了各种强制下载标头,但对某些用户有效的方法对其他人无效。

现在,问题是,是否可以保持与 mp3 文件的直接链接,并且每当有人单击 mp3 文件以同时运行允许或拒绝请求的跟踪 php 脚本时?

谢谢!

(服务器没有 mod_bandwidth 或任何其他有用的 mod)

4

2 回答 2

1

与其在用户点击链接时同时跟踪使用情况,不如将登录页面设为一个 PHP 脚本来检查用户的 ip 并基于该脚本输出或隐藏链接?如果您的文件存储在一个明显的文件夹中,例如 yoursite/music/artist/song.mp3,您可以为它们创建软链接,这样会混淆路径。在 linux 服务器上,您可以使用 symlink() php 函数创建指向 /music 目录的软链接,并将路径输出为 yoursite/3awE2afeefef4a323/artist/song.mp3 ,它仍然应该是文件的直接链接,例如:

<?php
$target = 'music/';
$link = 'a322ewrr323211';
symlink($target, $link);
?>
<html>
<body>
     <a href="a322ewrr323211/artist/song.mp3">link</a>
</body>
</html>

然后在每晚或创建 24 小时后定期删除这些符号链接。

于 2012-12-18T14:49:12.313 回答
1

一个mod_rewrite解决方案将足够优雅,并且可以保持链接直接。

在您的.htaccess中,重写所有.mp3指向 PHP 脚本的链接:

RewriteEngine on
RewriteRule \.mp3$ download.php

在 PHP 文件中,我们可以提取请求的 URI,验证用户的 IP 并根据验证返回适当的标头。

<?php

// Set variables
$requestedFile = trim($_SERVER['REQUEST_URI'], '/');
$ip = $_SERVER['REMOTE_ADDR'];
$protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';

// If the file does not exist, throw a 404 error
if (!file_exists($requestedFile)) {
    header($protocol . ' 404 Not Found');
}

// Is the user allowed to download?
function validateDownload($ip) {
    /**
     * Put your IP tracking and validation code here, returning `TRUE`
     * or `FALSE`.
     */

    return TRUE;
}

// Validate and perform appropriate action
$canDownload = validateDownload($ip);

if ($canDownload) {
    header('Content-Disposition: attachment; filename="' . basename($requestedFile) . '"');
    header('Content-type: audio/mpeg');
    readfile($requestedFile);
} else {
    header($protocol . ' 403 Forbidden');
}

现在所有链接都保持直接,并且您将适当的标头返回给用户代理,提示下载或拒绝访问。

于 2012-12-18T15:29:44.557 回答