2011-08-19 41 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

相关问题