2010-12-04 21 views
22

Quiero deshabilitar el acceso a cualquier archivo O directorio, cuyo nombre comienza con un DOT. Se me ocurrió lo siguiente, pero deshabilita el acceso a los archivos/directorios que comienzan con DOT solo si están directamente en la raíz del documento.Configuración de Apache: Regex para deshabilitar el acceso a archivos/directorios que comienzan con un punto

<Files ~ "^\.|\/\."> 
    Order allow,deny 
    Deny from all 
</Files> 

Con esto,

http://my_server.com/.svn/entries --> Permission denied 
http://my_server.com/abcd/.svn/entries --> Accessible, should be disabled 

¿Cuál es la expresión regular adecuada para lograr esto?

Gracias,

JP

Respuesta

45

código no funciona porque <Files> sólo se aplica a la nombre base del documento solicitado. Es decir, la parte después de la última barra. (fuente: http://httpd.apache.org/docs/current/mod/core.html#files)

Apache bloquea .htaccess archivos en una instalación predeterminada (mejor: todos los archivos comienzan con .ht). Si uno mira de cerca a los archivos de configuración, que se vería algo como esto:

<FilesMatch "^\.ht"> 
    Order allow,deny 
    Deny from all 
</FilesMatch> 

Así que para ocultar todos los archivos que comienzan con un punto, se debería utilizar:

<FilesMatch "^\."> 
    Order allow,deny 
    Deny from all 
</FilesMatch> 

Con el fin de hacer que funcione para los directorios que comienzan con un punto, utilizar la (probado) siguiente código:

<DirectoryMatch "^\.|\/\."> 
    Order allow,deny 
    Deny from all 
</DirectoryMatch> 
+0

Gracias por la explicación detallada. Esto funciona bien! –

16
RewriteRule (^\.|/\.) - [F] 

Esto negar de ver cualquier archivos o directorios que comienzan con punto. Afecta cualquier nivel en el árbol de rutas.

El modificador [F] al final dice que se prohíbe el acceso (no es necesario que el modificador L diga que es la última regla que se debe aplicar, está implícito por defecto).

La expresión regular tiene dos partes (cualquiera de ellos permitió a la altura, no se requiere para ser a la vez):

(part1|part2) 

La primera parte coincide con todo lo que se inicia a partir del punto (para el caso cuando se utiliza en por directorio de archivos .htaccess y no habrá barra al inicio de la cadena estamos igualando el):

^\. 

por ejemplo, esto funcionará para .test, .git/HEAD pero no funcionará para /.git, path/.hidden.

La segunda parte coincide con cualquier cosa que contenga barra seguida de punto. Esto es útil si tiene esta regla en VirtualHost o en la configuración de Apache lateral, en la que una cadena de casos que coincidamos puede comenzar con una barra inclinada.

Esta regla coincidirá: /.git, some/.hidden Esta regla no coincidirá con: .git, .hidden

Cuando combinamos estas dos reglas, parece que cubrimos todos los casos posibles.

+0

Esto funciona perfectamente en deb.jessie. Gracias. – Spooky

1

Con mod reescribir:

RewriteEngine on 

RewriteCond %{THE_REQUEST} ^.*/\. 
RewriteRule ^(.*)$ - [R=404] 

Cada archivo o directorio que comienzan con un punto serán redirigidos a 404.

/myDir/.svn => 404 
/.gitignore => 404 
/dir1/dir2/dir3/..../.toHide => 404 
2

Esto funciona perfectamente para mí (Apache 2.4):

<LocationMatch "\/\."> 
    Require all denied 
</LocationMatch> 

Niega cualquier URL que contenga un componente que comience con un punto (archivo o directorio).

Cuestiones relacionadas