¿Cómo decirle a .htaccess que solo permita solicitudes a las carpetas index.php y app/dist/*?

¿Cómo decirle a .htaccess que solo permita solicitudes a las carpetas index.php y app/dist/*?

Esta es la carpeta actual:

/app
  /dist
    /index.html
    /index.css
    /index.js
  /src
    /configurations.json
/index.php
/configurations.php

Tengo datos sensibles por todas partes:

  • app/src/...
  • /...

Quiero que los usuarios solo puedan acceder a:

  • index.php
  • app/dist/whateverfile.whateverformat

La distcarpeta puede cambiar, por lo que tengo que permitirles acceder a este directorio de forma estática, para no tener que enumerar todos los archivos.

¿Cómo se supone que debe hacerse esto con esta .htaccesssintaxis?

Tengo esta configuración, que me permite acceder al index.php. Pero no hay idea de cómo lograrlo para la distcarpeta...

Options -Indexes
DirectoryIndex index.php

<FilesMatch ".*">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

<Files index.php>
    Order allow,deny
    Allow from all
    Satisfy All
</Files>

<Files "">
    Order allow,deny
    Allow from all
    Satisfy All
</Files>

Gracias de antemano.

Respuesta1

Las directivas <Files>y <FilesMatch>solo se dirigenarchivos, no directorios. Si tiene acceso a la configuración del servidor, quizás utilice un <Directory>contenedor.

Usando mod_rewrite

Puedes .htaccessusar mod_rewrite para restringir el acceso a cualquier cosa que no sea /index.phpo /app/dist/.

Por ejemplo:

RewriteEngine On

RewriteRule !^(index\.php$|app/dist/) - [F]

Lo anterior responderá con un 403 Prohibido para cualquier solicitud que no se /index.phpinicie o no se inicie /app/dist/. Si desea devolver un 404, cámbielo Fa R=404.

El !prefijo en la expresión regular niega la expresión regular. Tenga en cuenta que la ruta URL que coincide con elRewriteRule patrónno comienza con una barra.

Si solo desea responder con un 403 para solicitudes que se asignarían a archivos o directorios reales (y 404 en caso contrario), agregue un par de condiciones que verifiquen el sistema de archivos (pero tenga en cuenta que las verificaciones del sistema de archivos son relativamente costosas, por lo que, a menos que las necesite, no los uses). Por ejemplo:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(index\.php$|app/dist/) - [F]

Sólo si la URL solicitada no está en el "grupo" permitidoyse asigna a un archivo o directorio es la RewriteRuledirectiva que se aplica.

Sin embargo, supongo que sus URL en realidad no contienen index.php(¿verdad?), en cuyo caso el usuario solicita /y mod_dir emite una subresolicitud interna para /index.php(el DirectoryIndex). En cuyo caso, deberá hacer que sea index.phpopcional.

Por ejemplo:

RewriteRule !^((index\.php)?$|app/dist/) - [F]

Usando una expresión de Apache

Alternativamente, puedes hacer esto con una expresión de Apache (Apache 2.4)

<If "%{REQUEST_URI} !~ m#^/((index\.php)?$|app/dist/)#">
    Require all denied
</If>

Lo anterior responde con un 403 para cualquier solicitud de URL que no sea /o /index.phpcomience con /app/dist/.

Tenga en cuenta que Order, Allow, Deny, etc. son directivas de Apache 2.2 más antiguas y están oficialmente obsoletas en Apache 2.4.


Usando mod_setenvif

Otra alternativa es usar mod_setenvif y establecer una variable de entorno si se solicita una de las rutas URL permitidas y solo permitir el acceso si se establece esta var de entorno.

Por ejemplo:

SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED

Lo anterior establece la ALLOWEDvar de entorno si se solicita cualquiera de las rutas URL permitidas. Luego, la Requiredirectiva requiere que esta var env esté configurada para otorgar acceso; de lo contrario, se devuelve un 403.

Respuesta2

Si este es tu principal problema:"Tengo datos sensibles por todas partes"

Esto se resuelve de la manera más fácil y confiable moviendo esa información sensible a algún lugar fuera de la raíz web...

Considere una raíz web (su DocumentRoot) que solo contenga index.php
Cuando no hay otros datos allí, tampoco necesita reglas complejas para protegerla...


Luego puede utilizar, por ejemplo, elAliasdirectiva (preferiblemente en el archivo de configuración de su servidor principal, o si prefiere un .htaccessarchivo en su raíz web) o reglas mod_rewrite para asignar URI a documentos almacenados en directorios fuera de sus directorios/archivos DocumentRoot para permitir específicamente el acceso.

es decir

.
`-- some-path
    |-- app
    |   `-- dist
    |       |-- index.css
    |       |-- index.html
    |       `-- index.js
    |-- src
    |   `-- configurations.json
    `-- www.example.com
        |-- .htaccess
        `-- index.php

Donde su configuración principal de Apache se define /some-path/www.example.comcomo DocumentRootforwww.ejemplo.com. Entonces
puede .htaccessser algo como esto que expone el directorio /some-path/app/ y todo su contenido como la ruta URI.http://www.example.com/app/

# /some-path/www.example.com/.htaccess
# exposes/some-path/app/ directory  as the URI path `http://www.example.com/app/`

Alias "/app" "/some-path/app"

O sea más específico Alias "/app/dist" "/some-path/app/dist"o creativo con una expresión regular en una AlaisMatchdirectiva.

Respuesta3

Así es como:

Options -Indexes
ServerSignature Off 
DirectoryIndex index.php

RewriteEngine on
RewriteRule ^ui(/)?$ app/dist/index.html [QSA,END,NC,L]
RewriteRule ui/(.*) app/dist/$1 [QSA,END,NC,L]
RewriteRule !(ui/.*) index.php [QSA,END,NC,L]

Observe la ENDbandera después de cada partido. Esta bandera es necesaria para simular la if-elsesintaxis típica. Pero no está documentado en los documentos oficiales.

Finalmente me mudé a Node.js.

información relacionada