Prohibir el acceso al directorio excepto un solo subdirectorio con .htaccess

Jun 23 2020

Tengo una siguiente estructura de directorio en el sistema de archivos:

/users/[uid1]/

/users/[uid2]/etc. (la parte de UID es dinámica en la URL, como /users/abc123/o /users/def456/)

Dentro de uid-dirs también tengo algunos subdirectorios y archivos, por ejemplo: images-dir another-dir file1 file2

También tengo un archivo .htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

Así que reescribo cada solicitud en index.php para enrutamiento, solo si el archivo solicitado no existe en el sistema de archivos.

¿Puedo de alguna manera prohibir el acceso a /users/[uid]/*excepto images-dir?

Por ejemplo, permita:

/users/123abc/images-dir/some-image.jpg

y negar:

/users/123abc/another-dir

/users/123abc/file1

Necesito denegar el acceso directo a estos subdirectorios Y si alguien intenta obtener el contenido de los archivos prohibidos, quiero enviar una solicitud a index.php

¿Es posible hacerlo con .htaccess?

Gracias

Respuestas

MrWhite Jun 23 2020 at 07:13

Supongo que tiene un solo .htaccessarchivo en la raíz del documento.

Puede hacer algo como lo siguiente antes de sus directivas existentes:

# If the request maps to a file or directory in the /users/<uid> space
# But is not the "images-dir" then forbid access
RewriteCond %{REQUEST_URI} !^/users/\w+/images-dir/
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^users/\w+/ - [F]

\w+coincide con <uid>e incluye caracteres alfanuméricos y subrayados. Si <uid>sigue un formato específico, entonces podría ser más específico aquí.

Si solo hace referencia a recursos estáticos en el /users/<uid>/...espacio (es decir, sin URL virtuales), puede eliminar las comprobaciones del sistema de archivos anteriores, ya que sabe que cada solicitud tiene como objetivo un recurso del sistema de archivos.