Hola
Yo utilizo la forma de Nefertiter, pero utilizo un directorio que esta fuera del directorio donde están los ficheros web, me explico. Mi proveedor de servicio me da el directorio "usuario/web" y yo tengo un directorio "usuario/download" quedando el arbol de directorio del "raiz":
Código PHP:
usuario/download
usuario/web
usuario/web/index.php, descargas.php, login.php ......
.... y demas arbol de directorios con sus ficheros que forman la web
despues tendo en base de datos las rutas a cada uno de los ficheros a descargas y mediante el script descargas.php le paso un identificador para la consulta sql realizando un escalado de directorios mediante este script.
Si alguien intentara realizar una descarga por direccion absoluta del tipo
Código PHP:
www.midominio.com/descargas.php?Id=1
el escript detecta este intento y lo aborta, pero si lo intentan desde la pagina de descargas lo permito en base a una variable y permisos de la tabla de mysql.
Igual no ha quedado muy claro, si tienes alguna duda comentame; de todas formas esta idea la saque de unos post de este mismo foro y despues lo ajuste a lo que quería hacer.