Problema: No queremos usuarios apache
Algunas veces nos encontramos que queremos restringir el acceso a documentos de una carpeta de forma que solo unos usuarios puedan acceder a ellos, independientemente si están validados y usando nuestra aplicación o están accediendo de forma directa al archivo mediante una url.
Podríamos restringir el acceso mediante usuarios de apache, pero nosotros queremos almacenar usuarios y contraseñas desde la gestión de nuestra aplicación web.
Solución: Combinar php con htaccess
En nuestro fichero .htaccess añadimos las siguientes lineas:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^\/(ruta a la carpeta)\/.*$
RewriteRule !^((.*.php)|(.*\/))$ acceso.php
En el fichero «acceso.php» es donde programamos la validación. Según cada caso validaremos que tengamos la sesión activa, la cookie, conectaremos con la base de datos, solicitaremos usuario o contraseña, etc, etc. Cada cual que haga lo que necesite, pero para mostrar el contenido, si la validación es la correcta, necesitaremos el siguiente código:
if($tengoacceso){ // COMPRUEBO QUE EL FICHERO EXISTE if(file_exists($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'])){ // OBTENGO EL CONTENIDO DEL FICHERO $fp = fopen($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], 'r'); // OBTENGO EL MIME Y DEFINO EL HEADER DEL CONTENIDO QUE VOY A LANZAR header('Content-type: '.mime_content_type($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'])); // LO ENVIO AL NAVEGADOR Y LISTO fpassthru($fp); fclose($fp); }else{ // NO SE HA ENCONTRADO EL FICHERO -> SUGERENCIA: REDIRIGE A UN 404 header("http://www........") } }else{ // NO TENGO ACCESO -> SUGERENCIA: REDIRIGE A UNA PAGINA DE ERROR header("http://www........"); }
Ya está todo. Con esos dos sencillos pasos podemos tener nuestro contenido bien protegido.