2010-12-04 20 views
22

Je souhaite désactiver l'accès à un fichier OU répertoire, dont le nom commence par un point DOT. J'ai trouvé ce qui suit, mais cela désactive l'accès aux fichiers/répertoires commençant par DOT seulement s'ils sont directement dans la racine du document.Configuration Apache: Regex pour désactiver l'accès aux fichiers/répertoires commençant par un point

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

Avec cela,

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

Quelle est la bonne regex pour y parvenir?

Merci,

JP

Répondre

45

code Vous ne fonctionne pas parce que <Files> applique uniquement à la basename du document demandé. C'est-à-dire, la partie après la dernière barre oblique. (source: http://httpd.apache.org/docs/current/mod/core.html#files)

Apache bloque les fichiers .htaccess dans une installation par défaut (mieux: tous les fichiers commençant par .ht). Si vous avez regardé attentivement les fichiers de configuration, vous verrez quelque chose comme ceci:

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

Donc, pour cacher tous les fichiers commençant par un point, vous utilisez:

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

Afin de faire fonctionner pour les répertoires commençant par un point, utilisez les éléments suivants (testé) Code:

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

Merci pour l'explication détaillée. Cela fonctionne bien! –

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

Cela refusera d'afficher tout fichiers ou répertoires commençant par un point. Il affecte n'importe quel niveau dans l'arborescence des chemins.

Le modificateur [F] à la fin dit d'interdire l'accès (pas besoin de modificateur L pour dire que c'est la dernière règle à appliquer, elle est implicite par défaut).

L'expression régulière comporte deux parties (l'un d'eux autorisés à correspondre, non nécessaire pour être à la fois):

(part1|part2) 

La première partie correspond à tout ce qui commence par point (pour le cas où vous l'utilisez dans par répertoire fichier .htaccess et il n'y aura pas de barre oblique au début de la chaîne nous correspondant sur):

^\. 

par exemple, cela fonctionnera pour .test, .git/HEAD mais ne fonctionnera pas pour /.git, path/.hidden.

La seconde partie correspond à tout élément contenant une barre oblique suivie d'un point. Ceci est utile si vous avez cette règle dans VirtualHost ou dans une configuration Apache sur le côté, dans laquelle une chaîne de requête que nous rencontrons peut commencer par slash.

Cette règle correspondra: /.git, some/.hidden Cette règle ne correspond pas à: .git, .hidden

Lorsque nous combinons ces deux règles, il semble que nous couvrons tous les cas possibles.

+0

Cela fonctionne parfaitement sur deb.jessie. Merci. – Spooky

1

Avec mod rewrite:

RewriteEngine on 

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

Chaque fichier ou répertoire qui commencent par un point seront redirigés vers 404.

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

Cela fonctionne parfaitement pour moi (Apache 2.4):

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

Refuse toute URL contenant un composant commençant par un point (fichier ou répertoire).