2012-12-17 38 views
4

我被毀壞的機器人和惡意用戶試圖取消我的網站。使用htaccess和php的mp3帶寬限制使用htaccess和php

我試圖通過將mp3文件的所有請求mod_rewriting到php腳本來跟蹤每個ip並限制每個小時可以下載多少個帶寬限制器。這工作正常,但它爲一些用戶創建了很多問題,鏈接不是直接鏈接到mp3文件。

我試過各種強制下載標題,但對一些用戶有效的工作不適用於其他用戶。

現在,問題是,是否有可能保持與mp3文件的直接鏈接,以及何時有人點擊mp3文件以同時運行可允許或拒絕請求的跟蹤php腳本?

謝謝!

(服務器沒有mod_bandwidth的或任何其他有用的MOD)

+0

主持一個洪流跟蹤器和洪流它們= o)免費帶寬然後!只是在開玩笑,阻止機器人設置驗證碼,並在成功時提供哈希ID鏈接,然後爲MP3提供服務​​。至於惡意用戶,他們在做什麼?驗證碼也應該放慢速度,但需要更多信息。 –

+0

thnx。但你如何提供mp3的。唯一讓大家開心的是直接鏈接。如果我使用readfile的服務器,我收到了無法下載的人的投訴。嘗試了各種各樣的http頭,但沒有雪茄。 – user1909257

+0

可以使用爲mp3文件設置專門的子域名嗎?如果是這樣,那麼你可以通過'Host'頭來處理這個問題,然後所有其他的請求都會不同。具體而言,您可以將現有的限制性php腳本作爲index.php放置在該子域中,因此鏈接將保持「直接」,但限制將透明地啓用。 – Stan

回答

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小時後。

1

A 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'); 
} 

現在所有鏈接保持直接,並且您將相應的標題返回給用戶代理,提示下載或拒絕訪問。

+0

謝謝,但標題和讀取文件不適用於某些人。這就是爲什麼我想保持直接鏈接 – user1909257

+0

@ user1909257如果這種技術不適用於某些用戶,那麼很可能他們沒有使用瀏覽器下載文件,而是使用某種形式的下載管理器。 PHP頭文件可能會有點bug,特別是在較舊版本的IE(6和7)中,但添加了一些額外的頭文件(詳細信息請參見#3:http://www.richnetapps.com/the-right-way-to-處理文件下載在PHP /)通常可以解決這個問題。所有其他瀏覽器在正確發送時都不會理解這些標題,如我的示例中所示。 – amustill