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 dist
carpeta 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 .htaccess
sintaxis?
Tengo esta configuración, que me permite acceder al index.php
. Pero no hay idea de cómo lograrlo para la dist
carpeta...
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 .htaccess
usar mod_rewrite para restringir el acceso a cualquier cosa que no sea /index.php
o /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.php
inicie o no se inicie /app/dist/
. Si desea devolver un 404, cámbielo F
a 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 RewriteRule
directiva 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.php
opcional.
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.php
comience 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 ALLOWED
var de entorno si se solicita cualquiera de las rutas URL permitidas. Luego, la Require
directiva 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, elAlias
directiva (preferiblemente en el archivo de configuración de su servidor principal, o si prefiere un .htaccess
archivo 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.com
como DocumentRoot
forwww.ejemplo.com. Entonces
puede .htaccess
ser 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 AlaisMatch
directiva.
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 END
bandera después de cada partido. Esta bandera es necesaria para simular la if-else
sintaxis típica. Pero no está documentado en los documentos oficiales.
Finalmente me mudé a Node.js.