2011-08-19 86 views
32

我有一個網站,用戶應該能夠登錄並收聽一首歌曲(一個自制的mp3)。我想這樣做,登錄的用戶可以監聽/下載/任何文件,並且文件應駐留在服務器上(不要存儲在MySQL數據庫中),但不能被具有該路徑的非用戶訪問到URL。PHP:如何阻止對文件的直接URL訪問,但仍允許通過登錄用戶下載?

例如:說我的mp3位於mysite.com/members/song.mp3如果您已經登錄,您應該能夠看到mysite.com/members/index.php頁面,這將允許訪問到song.mp3文件。如果您未登錄,mysite.com/members/index.php頁面將不會顯示song.mp3文件,並且直接鏈接到它不應該授予訪問權限。

我很確定這是通過htaccess完成的,我已經做了很多谷歌搜索,並在這裏搜索。我發現兩個最接近的答案是這個htaccess指南http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/和這個StackOverflow問題Block direct access to a file over http but allow php script access,但都不回答我所有的問題,以滿足我的標準。我錯過了什麼?

回答

53

進入文件夾成員創建新的文件夾文件,在這裏將你的所有歌曲,創造新的的.htaccess文件,並添加以下行:

Order Deny,Allow 
Deny from all 


進入文件夾的成員創建文件 get_song.php並添加如下代碼:

if(!empty($_GET['name'])) 
{ 
    // check if user is logged  
    if(is_logged()) 
    { 
    $song_name = preg_replace('#[^-\w]#', '', $_GET['name']); 
    $song_file = "{$_SERVER['DOCUMENT_ROOT']}/members/files/{$song_name}.mp3"; 
    if(file_exists($song_file)) 
    { 
     header('Cache-Control: public'); 
     header('Content-Description: File Transfer'); 
     header("Content-Disposition: attachment; filename={$song_file}"); 
     header('Content-Type: application/mp3'); 
     header('Content-Transfer-Encoding: binary'); 
     readfile($song_file); 
     exit; 
    } 
    } 
} 
die("ERROR: invalid song or you don't have permissions to download it."); 


而現在,你可以使用這個網址來獲得歌曲文件:
http://mysite.com/members/get_song.php?name=my-song-name

+0

這工作,非常感謝你! – Bing

+2

除了拒絕直接訪問,您可以將文件存儲在wwwroot之外。 –

+0

這對我來說:)謝謝... –

3

您是否正在使用PHP等腳本語言來處理您的網站?如果是這樣,那麼最好的方法是創建一個處理內容「交付」的腳本。將內容保存在受保護的目錄中,即在http或www文件夾之上。然後,當用戶登錄時,鏈接到你的內容是這樣的:

http://yoursite.com/listen.php?song_id=xxx

腳本將通過ID找到所需要的歌曲,然後將數據呈現給用戶

7

的只有通過.htaccess才能做到的事情需要一個來自您的網站的引用者,而且它不安全。僞造推薦人是無足輕重的,任何人都可能會榨乾你的網站。

只有你可以只有登錄用戶下載該文件的方式是將文件放在你的webroot的外部,並有一個PHP腳本調解訪問。總之:

if (is_logged_in()) { 
    readfile($name_of_file); 
} else { 
    die("Access denied"); 
} 
+6

would not say它的「唯一的東西」 – Nick

相關問題