.htaccess
est un simple fichier texte qui vous permet
de gérer de manière décentralisée un serveur Apache (le serveur des
élèves, par exemple). Par exemple, .htaccess
vous permet
de protéger certains répertoires avec des mots de passe, de
restreindre l'accès à votre page Web, d'empêcher le listage de vos
répertoires (quand ils ne contiennent pas de fichier index.html), ou
encore d'utiliser vos propres pages d'erreur (404, 403)...
Les directives d'un .htaccess
s'appliquent à
l'ensemble des fichiers du répertoire dans lequel il est placé, ainsi
qu'aux sous-repertoires. .htaccess
est lu à chaque
requête du serveur, donc chaque modification prend effet
immédiatement.
.htaccess
causera une erreur serveur et empêchera tout
accès à votre site. Vérifiez donc bien que tout marche bien à chaque
modification de ce fichier. Une consultation des logs de webmaster
(/opt/webmaster/var/log/error_log.curr
) vous aidera à
diagnostiquer ce qui ne marche pas.Précisons enfin que chaque ligne commençant par un dièse (#) est ignorée, ce qui vous permet de commenter vos directives.
Tout le monde connaît bien les pages d'erreur 404 (File Not Found), 403 (Forbidden), 500 (Internal Server Error)... Il peut être utile de personnaliser ce type de pages d'erreur (surtout les erreurs 404), par exemple pour demander à l'internaute de vous signaler les liens cassés, ou pour lui proposer de faire une recherche sur le site (il existe un moteur Google pour le serveur des élèves).
D'abord, créez vos propres pages d'erreur. Ensuite, dans votre
fichier .htaccess
, écrivez :
ErrorDocument numero_d'_erreur /chemin/du/fichier.html
Il est plus simple de nommer vos pages 403.html, 404.html, etc., ce qui donne :
ErrorDocument 404 /home/toto/404.html
Voici quelques unes des erreurs les plus courantes :
Les redirections sont particulièrement utiles quand vous modifiez
l'architecture de votre page Web. Par exemple, vous avez décidé de
ranger tous vos exposés dans un répertoire
~/www/exposes/
. Vous souhaitez que quelqu'un qui veut
accéder à l'ancien ~/www/expose1.html
soit rerouté vers
la nouvelle adresse, ~/www/exposes/1.html
.
Ceci est à spécifier dans votre .htaccess
:
RedirectPermanent /home/toto/expose1.html http://www.eleves.ens.fr/home/toto/exposes/1.html
Et ainsi de suite pour tous les fichiers concernés.
Vous pouvez aussi de cette manière rediriger les requètes vers un répertoire entier, et les rediriger vers un site à l'extérieur de l'ENS :
RedirectPermanent /home/toto/chevaux/ http://www.toto-chevaux.net/
De cette façon, les requètes vers vos anciennes pages dans le répertoire
~/www/chevaux/
seront toutes redirigées vers le site
http://www.toto-chevaux.net/
. Par exemple,
~/www/chevaux/soins.html
sera redirigée vers
http://www.toto-chevaux.net/soins.html
.
Quand un répertoire ne contient pas de fichier index.html (ou index.htm), Apache liste le contenu du répertoire, en donnant quelques informations, typiquement la taille des fichiers. Mais il est possible de spécifier d'autres informations, comme la date de dernière modification, et d'ajouter une courte description de chaque fichier.
La syntaxe est la suivante : IndexOptions FancyIndexing
<autres directives>
. Ces autres directives sont les
suivantes :
IconsAreLinks
ScanHTMLTitles
SuppressSize
SuppressDescription
SuppressLastModified
Exemple : vous avez un répertoire d'images appelé
~/www/images/
, vous souhaitez avoir la taille et la
description de chacune des images. Vous en profitez pour supprimer la
date de dernière modification, qui ici vous importe peu et prend de la
place.
IndexOptions SuppressLastModified FancyIndexing AddDescription "Le bassin aux Ernests" images/ernests.gif AddDescription "La planète Mars" images/mars.jpg
Pour une raison quelconque, vous n'utilisez pas de fichiers
index.html ou index.htm. Par exemple, vous utilisez PHP et pour vous,
les fichiers d'index s'appellent index.php
. Ou encore,
vos fichiers d'index s'appellent tagada.html
. Vous pouvez
indiquer au serveur quels fichiers considérer comme des fichiers
d'index :
DirectoryIndex index.php
Si vous utilisez des fichiers d'index aux noms différents, vous pouvez créer une liste. Apache regarde d'abord si le fichier cité en premier existe, et à défaut passe au suivant jusqu'à ce qu'il en trouve un, sinon il affiche le contenu du répertoire (sauf si vous avez désactivé cette fonction, bien sûr).
DirectoryIndex index.php tagada.html main.html index.html
Vous pouvez interdire l'accès à votre site à partir de certaines
adresses IP. Dans ce document, il ne sera question que des adresses
IPv4, dont on rappelle qu'elles sont constituées de quatre nombres de 0
à 255 séparés par des points (par exemple l'adresse IP de sas.eleves est
129.199.121.11
).
Pour interdire une adresse IP :
deny from 123.456.789.10
Inversement, on peut autoriser une adresse IP :
allow from 123.456.789.10
Si on indique un ou deux nombres seulement, ils sont interprétés
comme des plages d'adresses IP. Par exemple, allow from
129.199
autorise tous les accès venant de l'École. deny
from all
interdit à tout le monde l'accès à vos fichiers, mais
des scripts peuvent continuer à les utiliser.
En pratique, une interdiction de certaines IP prend la forme suivante :
order allow,deny deny from 123.45.6.7 # on interdit l'adresse précise 123.45.6.7 deny from 12.34.5 # on interdit toutes les adresses IP commençant par 12.34.5 allow from all # on autorise tous les autres
Le rôle de la directive order
ci-dessus est d'indiquer
l'ordre dans lequel les directives deny
et
allow
doivent être évaluées. Il faut préciser soit
allow,deny
(auquel cas les requêtes sont refusées sauf si
elles sont désignées par une directive allow
et aucune
directive deny
), soit deny,allow
(auquel cas
les requêtes sont acceptées sauf si elles sont désignées par une
directive deny
et aucune directive allow
).
Remarquez que, d'une façon quelque peu contre-intuitive, l'ordre réel
des directives allow
et deny
dans le fichier
.htaccess
est sans importance.
Exemple : vous souhaitez réserver une partie de votre site aux
connexions venant de l'École. Admettons qu'il s'agisse de votre
répertoire ~/www/normalos/
. Créez dans ce répertoire une
fichier .htaccess
dans lequel vous écrirez :
order deny,allow deny from all allow from 129.199
On peut aussi utiliser des noms de domaine. Admettons que vous n'aimiez ni le gouvernenent américain ni l'entreprise de M. Gates. Vous pouvez écrire :
Deny from .gov microsoft.com
JavaScript vous permet également ce genre d'identification, mais il vaut mieux passer par .htaccess : il est périlleux de confier la sécurité au navigateur de l'internaute, qui en fait ce qu'il veut. Vous n'avez pas ce genre de problème côté serveur.
Gardez cependant à l'esprit que la protection par mot de passe au niveau du serveur va faire passer le mot de passe en clair (non crypté). Si vous protégez par mot de passe un répertoire, il est possible de passer outre votre protection si l'on a connaissance de sous-répertoires non protégés.
Procédons par étapes.
1) On commence par créer un fichier .passwds
qui
contiendra les renseignements sur les personnes autorisées. Pour ce
faire, on tape :
htpasswd -c .passwds toto
Ce qui crée à la fois .htpasswd
et l'utilisateur toto,
pour lequel on vous demande un mot de passe.
sas ~ $ htpasswd -c .passwds
toto
New password:
Re-type new password:
Adding password for user toto
Pour ajouter d'autres utilisateurs : htpasswd .htpasswd
titi
. Pour en retirer, il suffit d'éditer le fichier et
d'effacer la ligne correspondant à l'utilisateur
concerné. htpasswd
chiffre les mots de passe (en
utilisant une variante de md5), qui ne figurent donc pas en clair dans
les fichiers.
Pour en savoir plus, consultez la page de man de htpasswd.
2) On en revient à .htaccess
et on tape :
AuthType Basic AuthUserFile /users/03/pataphys/vian/www/repertoire/.passwds # endroit où vous conservez les mots de passe AuthName "Entrez votre mot de passe" # ici vous indiquez ce qui figurera dans la barre de titre # de la fenêtre require valid-user
Si vous voulez protéger par mot de passe seulement certaines
parties du site, il faut créer un .htaccess
dans le
répertoire concerné.
Vous ne voulez peut-être pas que l'on sache où vous rangez vos mots
de passe. Il faut dans ce cas empêcher l'accès au fichier
.htaccess
lui-même. Pour protéger le fichier,
taper :
<Files .htaccess> order allow,deny deny from all </Files>
Pour plus d'informations sur les fichiers .htaccess
, vous
pouvez vous reporter à l'article Wikipedia à
leur propos (qui n'est pas spécifique à Apache), ou au tutorial
à leur sujet qui figure dans la documentation d'Apache.