39

我有一个网站,用户应该能够登录并听一首歌曲(自创 mp3)。我想让它登录的用户可以监听/下载/任何东西,并且文件应该驻留在服务器上(不存储在 MySQL 数据库中),但不能被具有路径的非用户访问到网址。

例如:假设我的 mp3 位于 mysite.com/members/song.mp3 如果您已登录,您应该能够看到 mysite.com/members/index.php 页面,该页面将允许访问该歌曲。 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 but既不回答我所有的问题以满足我的标准。我错过了什么?

4

3 回答 3

61

进入文件夹成员创建新文件夹文件,将所有歌曲移至此处,创建新的.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." );


现在,您可以使用此 URL 获取歌曲文件:
http ://mysite.com/members/get_song.php?name=my-song-name

于 2011-08-19T21:45:42.807 回答
7

您可以通过 .htaccess 做的唯一事情是需要来自您的站点的引荐来源网址,这并不安全。伪造推荐人并非易事,任何人都可以吸干您的网站。

您只能让登录用户下载该文件的唯一方法是将文件放在您的 webroot 之外并使用 PHP 脚本进行访问。简而言之:

if (is_logged_in()) {
   readfile($name_of_file);
} else {
   die("Access denied");
}
于 2011-08-19T20:44:37.133 回答
3

您是否使用诸如 PHP 之类的脚本语言来处理您的网站?如果是这样,那么最好的方法是创建一个脚本来处理内容的“交付”。将内容保存在受保护的目录中,即在您的 http 或 www 文件夹上方。然后,当用户登录时,指向您的内容的链接将如下所示:

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

该脚本将通过 id 找到所需的歌曲,然后将数据呈现给用户

于 2011-08-19T20:43:07.877 回答