27/09/07
gestion des autorisations d'accès avec Apache

Évidemment, comme à chaque fois que l'on veut aller plus loin, une solution, que l'on peut avoir tendance à perdre de vue avec le temps, est de se plonger dans la documentation. Mais je vais commencer, comme ça s'est passé, par le cas concret.
Je voulais interdire d'accès certaines IP sur certains types de fichiers ou certaines URL ; cependant à la fin de mon .htaccess j'avais une règle d'interdictions plus générale, règle destinée à être appliquée à l'ensemble des fichiers. Et évidemment, il y avait une sorte de "conflit d'héritage" entre les allow,deny, puisque la dernière règle du fichier .htaccess est la dernière à entrer en application et prédomine, donc, sur les précédentes. Par exemple, si on écrit un .htaccess, de cette façon :
<FilesMatch "(rss|atom)"> Order allow,deny Allow from all Deny from 206.41.95.26 </FilesMatch> <Files ~ "^(.*)$"> Order allow,deny Allow from all Deny from 209.42.32.0/19 </Files>
La première IP ne sera interdite sur aucun fichier puisque la dernière règle dit : Allow from all sur tout et n'importe quoi ^(.*)$. Au final, en toute logique, seule l'interdiction sur le range IP de la dernière règle sera appliquée.
SetEnvIf et SetEnvIfNoCase
Et c'est là qu'un passage par la documentation peut être utile, on pourra alors découvrir que l'on peut utiliser SetEnvIf (ou SetEnvIfNoCase, selon les besoins) sur les Remote_Host et les Remote_Addr de la façon suivante :
<FilesMatch "(rss|atom)"> Order allow,deny Allow from all SetEnvIf Remote_Addr "206\.41\.95\.26" rss=1 </FilesMatch> <Files ~ "^(.*)$"> Order allow,deny Allow from all Deny from env=rss Deny from 209.42.32.0/19 </Files>
Maintenant notre première règle sera appliquée par la deuxième règle (qui est, volontairement, large) seulement si on accède à rss ou atom avec l'IP ciblée. De plus, SetEnvIf et SetEnvIfNoCase permettent l'utilisation d'expressions régulières ce qui pour certains sera plus confortable que, par exemple, le calcul de range IP. Il y a aussi la possibilité, bien plus connue, de bannir des User-agent avec les limites que ce genre de procédés impliquent. Personnellement, je suis agréablement surpris par la découverte de cette possibilité d'une gestion plus fine des autorisations/interdictions.