FAQ du serveur HTTP Apache
FAQ du serveur HTTP ApacheConsultez toutes les FAQ
Nombre d'auteurs : 9, nombre de questions : 47, dernière mise à jour : 14 juin 2021
- Qu'est-ce qu'un fichier .htaccess ?
- Pourquoi mon fichier .htaccess n'est pas pris en compte ?
- Comment mettre en place une authentification simple des utilisateurs ?
- Peut-on utiliser un chemin relatif pour le fichier .htpasswd ?
- Comment faire pour ne pas lister les fichiers d'un répertoire sans fichier d'index ?
- Comment interdire l'accès aux fichiers inc ou xml ?
- Comment exclure des pages particulières de l'authentification à laquelle elles seraient, en temps normal, soumises ?
- Comment interdire l'accès direct à mes images depuis un site extérieur (aka direct linking ou hotlinking) ?
Il s'agit d'un fichier à mettre dans le répertoire qui est accessible sur internet et qui permet de modifier sa configuration. Il est possible de faire les modifications suivantes :
- Ne pas lister le contenu d'un répertoire
- Protéger le répertoire avec un mot de passe
- Réécriture d'adresse (appelée aussi URL Rewriting)
- Gestion des erreurs 404 et autres
- ...
Sous Windows, vous ne pouvez pas créer de fichier commençant par un point donc appelez le "htaccess.txt" par exemple, transférez le sur le serveur et renommez le en ".htaccess" sur le serveur.
Lien : Tutoriel : Les principales utilisations du htaccess avec Apache
Ce sont des directives AllowOverride, renseignées par l'administrateur dans le fichier de configuration d'Apache, qui définissent quelles sont celles que l'on peut ou non placer dans un fichier .htaccess afin de limiter l'usage de ces derniers. Toute directive d'un fichier .htaccess non autorisée par l'administrateur sera alors ignorée (non traitée) par le serveur. Sa ou ses valeurs possibles (car cumulables) sont :
- AuthConfig : pour tout ce qui est lié à l'authentification ;
- FileInfo : concerne les contrôles de type de document ainsi que tout ce qui touche les entêtes HTTP. Citons, pour exemples connus, la réécriture et la gestion des erreurs (ErrorDocument) ;
- Indexes : relatif à l'indexation des répertoires (tel DirectoryIndex) ;
- Limit : permet la mise en place de contrôle d'accès sur l'adresse du client (trio Order, Allow, Deny);
- Options : rend possible la redéfinition de la directive du même nom.
Les valeurs particulières tout ou rien complètent la liste précédente :
- All : le fichier .htaccess ne fait l'objet d'aucune restriction ;
- None : tout fichier .htaccess ne sera même pas lu.
Cependant, ayant jusque là volontairement laissé de côté le contexte d'application de la directive AllowOverride, l'explication a été quelque peu simplifiée. Corrigeons à présent le tir. En effet, il faut savoir qu'elle se définit par rapport à un(des) répertoire(s) (donc à des blocs <Directory>...</Directory>) et qu'en son absence, le répertoire héritera des "permissions" de son parent, qui lui-même peut les tenir de son propre père.
Illustration : soit l'arborescence, schématique (voir explications plus bas), représentée ci-dessous :
/
DocumentRoot
forum
Le répertoire / représente la racine de votre système de fichiers (même sous Windows, considérez cela comme correspondant à votre Poste de travail). Etant le père de tout répertoire, c'est ici qu'il convient de définir votre politique, restrictive, par défaut afin d'ignorer les fichiers .htaccess hors partie web :
<Directory />
AllowOverride
None
# ...
</Directory>
Quant au répertoire correspondant à votre DocumentRoot, il vous permettra de spécifier un comportement plus ouvert appliqué par défaut sur l'ensemble de la partie que votre serveur publie. Ci-bas, un exemple autorisant, par défaut, aux usagers uniquement les contrôles d'accès, l'identification et l'indexation des répertoires :
<Directory DocumentRoot>
# Remplacer DocumentRoot par sa valeur
AllowOverride
AuthConfig Indexes
Limit
# ...
</Directory>
Enfin, dans la continuité de notre cas de figure, pour les besoins du forum en réécriture, nous ajoutons spécifiquement le droit FileInfo à cet endroit. Ce qui nous donne donc :
<Directory DocumentRoot/forum>
# Remplacer DocumentRoot par sa valeur
AllowOverride
AuthConfig FileInfo Indexes
Limit
</Directory>
Toutes les directives ne sont pas utilisables dans un fichier .htaccess pour des raisons techniques notamment, de sécurité ou de performance. Vous pourrez trouver le détail de chacune d'elle dans la documentation d'Apache (à la ligne Context).
Chaque directive est rattachée à un module. Si ce module n'est pas disponible sur votre serveur alors une erreur 500 (Internal Error) sera (aussi) déclenchée étant donné qu'elle ne sera pas reconnue.
Commencez par créer un fichier .htaccess indiquant qu'une authentification sera requise :
AuthUserFile "/chemin/complet/vers/le/fichier/.htpasswd"
AuthName Authentification
AuthType Basic
Require valid-user
Générer ensuite le fichier contenant la liste des couples login/mot de passe à l'aide de l'utilitaire htpasswd :
# Pour la première personne
htpasswd -cs .htpasswd login1
# Pour les personnes suivantes
htpasswd -s .htpasswd login2
L'option c crée le fichier. Elle ne doit être utilisée qu'à la création du premier compte sinon vous écraseriez le fichier. L'option s spécifie que les mots de passe seront stockés sous forme hachée avec l'algorithme appelé SHA1. Vous pouvez remplacer celle-ci par m pour utiliser l'algorithme MD5, d pour CRYPT ou p pour que ceux-ci apparaissent en clair.
Ces directives d'un fichier .htaccess ne sont effectives que si le
répertoire concerné dispose de la valeur AuthConfig ou
All pour sa sous-directive AllowOverride.
Le fichier faisant office de "base de données" des identifiants se
nomme par convention .htpasswd et n'est par défaut pas lisible par
un quelconque utilisateur au même titre qu'un fichier .htaccess.
L'hébergeur gratuit Free.fr est bien plus exigeant. Reportez-vous à Comment mettre en place une authentification chez Free ? de sorte à prendre connaissance de ses particularités.
Lien : Tutoriel : Les principales utilisations du htaccess avec Apache
Oui mais le chemin indiqué à la directive AuthUserFile sera relatif non pas par rapport au répertoire contenant le fichier .htaccess mais sera toujours lié à la racine du serveur (déterminée par la valeur de la directive ServerRoot).
Il suffit de mettre le code suivant dans un fichier ".htaccess" dans le répertoire à protéger :
Options
-Indexes
De cette façon le listage de tous les sous-répertoires sera aussi interdit.
Cette directive peut aussi se placer dans un bloc "Directory" dans le fichier de configuration du serveur.
Pour interdire l'accès à l'ensemble des fichiers portant une extension inc ou xml nous aurons besoin de recourir aux expressions régulières :
<FilesMatch "\.(inc|xml)$">
Order
allow
,deny
Deny
from
all
Satisfy
All
</FilesMatch>
Le point est échappé (précédé d'un antislash) car en temps normal il correspond à n'importe quel caractère. La barre verticale suggère une alternative (inc ou xml) et enfin le dollar signifie la fin du nom du fichier.
Cette directive ne sera effective uniquement si le répertoire, éventuellement par héritage, contenant ce fichier htaccess le permet via la directive AllowOverride qui doit au minimum posséder la valeur Limit.
Une version 2.0.51 est au minimum requise ici !
La solution consiste alors en la combinaison de trois éléments :
-
Distinguer la partie soumise à l'authentification de celle qui ne l'est pas. Pour ce faire, on utilisera les directives <Files> ou <FilesMatch> pour séparer les exceptions ;
-
Autoriser le client, pour ces ressources, à y avoir accès grâce à une règle Allow from all ;
-
Se pose maintenant le problème suivant : lorsqu'une partie d'un site est soumise à la fois à des politiques d'accès (via des règles Allow et Deny) et à une authentification (Require), le comportement par défaut vis à vis du client est tel qu'il doit remplir ces deux conditions.
Il est donc nécessaire à ce stade d'indiquer à Apache qu'une seule des conditions suffit à donner accès au document demandé. Ceci se gère via la directive Satisfy, dont les valeurs sont :
- All (par défaut) : le client doit satisfaire les politiques d'accès et l'authentification HTTP ;
- Any : une seule des deux suffit.
On choisira donc la dernière de sorte à ce que notre règle visant à autoriser tout le monde (Allow from all) prévale sur l'identification.
Pour illustrer, voici le fichier .htaccess à écrire pour que l'authentification HTTP s'applique à toutes les pages sauf à notre index :
Sélectionnez<Files index.php>
Satisfy
AnyAllow
from
all
</Files>
AuthUserFile /.../.htpasswd AuthName Authentification AuthType Basic Require valid-user
Pour interdire l'accès aux images, par exemple, que l'on héberge depuis un site extérieur, on se base sur l'origine du client, qu'il indique par l'entête appelée HTTP_REFERER :
-
A l'aide de la réécriture d'URL :
Sélectionnez<IfModule mod_rewrite.c>
RewriteEngine
On
RewriteCond
%{HTTP_REFERER} !^$RewriteCond
%{HTTP_REFERER} !^http://.*\.nom_de_domaine\.fr/ [NC]RewriteRule
\.(gif|jpe?g|png)$ - [F,NC]# Vous pouvez remplacer F par R=403
</IfModule>
-
En combinant les directives SetEnvIfNoCase et FilesMatch :
SélectionnezSetEnvIfNoCase
Referer"^https?://([^/]*)?nom_de_domaine\.fr/"
local_ref=1SetEnvIf
Referer ^$ local_ref=1<FilesMatch "\.(jpe?g|gif|png)$">
Order
allow
,deny
Allow
from
env=local_ref</FilesMatch>
Ces moyens, basés sur le référant, n'ont absolument rien de fiable, puisque cet entête peut être omis voir faussé par le client.