2011-08-19 11 views
32

Ho un sito Web in cui gli utenti dovrebbero essere in grado di accedere e ascoltare una canzone (un mp3 creato da sé). Voglio far sì che l'utente connesso possa ascoltare/scaricare/qualsiasi cosa, e il file deve risiedere sul server (non essere memorizzato nel database MySQL), ma non essere accessibile ai non utenti che hanno il percorso all'URL.PHP: Come posso bloccare l'accesso diretto all'URL a un file, ma permetterlo comunque di essere scaricato dagli utenti registrati?

Ad esempio: il mio mp3 si trova su mysite.com/members/song.mp3 Se è stato effettuato l'accesso, è possibile visualizzare la pagina mysite.com/members/index.php, che consente l'accesso al file song.mp3. Se non hai effettuato l'accesso, la pagina mysite.com/members/index.php non ti mostrerà il file song.mp3 e il collegamento diretto ad esso non dovrebbe garantire l'accesso.

Sono abbastanza sicuro che questo è fatto tramite htaccess, e ho già fatto un sacco di ricerche su Google, e ho cercato qui. Le due risposte più vicine che ho trovato sono state questa guida htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ e questa domanda StackOverflow Block direct access to a file over http but allow php script access ma non rispondono a tutte le mie domande per soddisfare i miei criteri. Cosa mi manca?

risposta

53

nella cartella membri Crea nuova cartella file, spostare qui tutte le tue canzoni, creare un nuovo file .htaccess e aggiungere le seguenti righe:

Order Deny,Allow 
Deny from all 


Nella cartella membri creare il file get_song.php e aggiungere il seguente codice:

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."); 


E ora, è possibile utilizzare questo URL per ottenere il file del brano:
http://mysite.com/members/get_song.php?name=my-song-name

+0

Questo ha funzionato, grazie mille! – Bing

+2

Invece di negare l'accesso diretto, è possibile memorizzare il file all'esterno di wwwroot. –

+0

Questo ha funzionato per me :) grazie ... –

3

Stai utilizzando un linguaggio di scripting come PHP per gestire il tuo sito web? se è così allora il modo migliore è creare uno script che gestisca la "consegna" del contenuto. Salva il contenuto in una directory protetta, ad esempio sopra la tua cartella http o www. Poi, quando l'utente è connesso, il link al suo sito web sarebbe simile a questa:

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

lo script sarà individuare il brano richiesto dalla id e poi presentare i dati all'utente

7

Il l'unica cosa che puoi fare per questo tramite .htaccess è richiedere un referente che proviene dal tuo sito, e NON è sicuro. è oltre ogni banale forgiare un referente e chiunque potrebbe risucchiare il tuo sito a secco.

Il SOLO in modo che solo gli utenti che hanno effettuato il login possano scaricare il file posizionando il file ESTERNO del webroot e avendo uno script PHP che supporti l'accesso. In breve:

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

non direbbe che è "l'unica cosa" – Nick

Problemi correlati