Le fichier .htaccess

Introduction

Les fichiers .htaccess sont des fichiers de configuration d'Apache (le serveur web), permettant de définir des règles dans un répertoire et dans tous ses sous-répertoires (qui n'ont pas de tel fichier à l'intérieur). On peut les utiliser pour protéger un répertoire par mot de passe, ou pour changer le nom ou l'extension de la page index, ou encore pour interdire l'accès au répertoire.

Intérêt des fichiers htaccess

Les fichiers .htaccess peuvent être utilisés dans n'importe quel répertoire.

Les principales raisons d'utilisation des fichiers .htaccess sont :

  • Gérer l'accès à certains fichiers.
  • Ajouter un mime-type.
  • Protéger l'accès à un répertoire par un mot de passe.
  • Protéger l'accès à un fichier par un mot de passe.
  • Définir des pages d'erreurs personnalisées.

Principe des fichiers htaccess

Le fichier .htaccess est placé dans le répertoire dans lequel il doit agir. Il agit ainsi sur les permissions du répertoire qui le contient et de tous ses sous-répertoires. Vous pouvez placer un autre fichier .htaccess dans un sous-répertoire d'un répertoire déjà contrôlé par un fichier .htaccess.

Le fichier .htaccess du répertoire parent reste en « activité » tant que les fonctionnalités n'ont pas été réécrites.

Les fonctionnalités de ces fichiers étant très puissantes, lisez bien ce tutorial avant de vous lancer dans la création des vôtres.

Sous Windows, il est logiquement impossible de créer un fichier .htaccess, puisque Windows ne vous autorisera pas à sauvegarder le fichier tel quel. Voici la démarche à suivre :

  1. Créer un fichier texte « fichier.htaccess »
  2. Renommer le fichier en supprimant « fichier »

Remarque : Selon votre éditeur, vous pouvez également sauvegarder le fichier directement en .htaccess. Sous Notepad, il suffit de mettre des guillemets autour du nom de fichier tandis que UltraEdit gère le nom lui-même.

Écrire correctement le chemin d'accès AuthUserFile

Chez FranceServ Hébergement, le chemin d'accès vers le fichier des mots de passe doit être écrit en absolu et non en relatif.

Exemple pour l'utilisateur “identifiant” qui possède le site “www.example.com” :

/home/web/identifiant/www/www.example.com/.htpasswd

Attention, le chemin d'accès n'est pas le même qu'avec PHP qui serai “/www/www.example.com/.htpasswd” ou simplement $_SERVER['DOCUMENT_ROOT'].'/.htpasswd'.

Empêcher l'accès à des ressources

Un fichier .htaccess est composé de deux sections :

  • Une première section contient les chemins vers les fichiers contenant les définitions de groupes et d'utilisateurs :
AuthUserFile /repertoire/de/votre/fichier/.FichierDeMotDePasse
AuthGroupFile /repertoire/de/votre/fichier/.FichierDeGroupe
AuthName "Accès protégé"
AuthType Basic
  • AuthUserFile définit le chemin d'accès absolu vers le fichier de mot de passe.
  • AuthGroupFile définit le chemin d'accès absolu vers le fichier de groupe.
  • AuthName entraîne l'affichage dans le navigateur Internet de : « Tapez votre nom d'utilisateur et votre mot de passe. Domaine: “Accès protégé” »
  • AuthType Basic précise qu'il faut utiliser AuthUserFile pour l'authentification.
  • Une seconde section contient la définition des conditions d'accès :
<Limit GET POST>
Require valid-user
{instruction d'accès à satisfaire }
</Limit>
  • La balise LIMIT possède en attribut la valeur GET (en majuscule) et/ou la valeur POST, afin de définir le type de méthode du protocole HTTP auxquelles la restriction s'applique. Le mieux semble être de ne pas la spécifier pour ne pas oublier des méthodes de connexions autres que POST et GET.
  • require valid-user précise que l'on autorise uniquement les personnes identifiées. Il est également possible de préciser explicitement le nom des personnes autorisées à s'identifier : require user {username}

Protéger un répertoire par un mot de passe

Il s'agit d'une des applications les plus utiles du fichier .htaccess car elle permet de définir de façon sûre (à l'aide d'un login et d'un mot de passe) les droits d'accès à des fichiers par certains utilisateurs.

La syntaxe est la suivante :

AuthUserFile {emplacement du fichier de mot de passe}
AuthGroupFile {emplacement du fichier de groupe}
AuthName "Accès protégé"
AuthType Basic
Require valid-user

La commande AuthUserFile permet de définir l'emplacement du fichier contenant les logins et les mots de passe des utilisateurs autorisés à accéder à une ressource donnée.

La commande AuthGroupFile permet de définir l'emplacement du fichier contenant les groupes d'utilisateurs autorisés à s'identifier. Il est possible d'outrepasser cette déclaration en déclarant le fichier suivant : /dev/null.

Pour information, le fichier .htaccess doit être encodé en latin1 (iso-8859-1) pour que les accents dans “Accès protégé” soient correctement affichés dans la boite de dialogue.

Voici un exemple de fichier .htaccess :

L'utilisateur chez FranceServ Hébergement ayant pour identifiant “identifiant” souhaites protéger le dossier “/admin” de son site “www.example.com”.

AuthUserFile /home/web/identifiant/www/www.example.com/admin/.htpasswd
AuthGroupFile /dev/null
AuthName "Accès sécurisé au site"
AuthType Basic
Require valid-user

Le fichier de mot de passe est un fichier texte devant contenir sur chacune des ses lignes le nom de chaque utilisateur suivi des deux points (:), puis du mot de passe crypté.

Voici un exemple de fichier contenant des mots de passe cryptés (ici .htpasswd) :

JFPillou:$apr1$Si0.....$teyL5Y7BR4cHj0sX309Jj0
Damien:$apr1$TD1.....$sfPTHjoufoNsda4HsD1oL0
Comma:$apr1$zF1.....$wYKqRu2aVYlAEQnxVkly8.

.htpasswd est un simple fichier texte contenant les noms des utilisateurs suivis d'un : puis du mot de passe crypté de cet utilisateur.

Ce fichier de mot de passe ne devrait pas être mis dans un répertoire accessible au public. Pourquoi ne pas le placer dans un autre dossier avec un .htaccess qui bloque intégralement son accès dans ce même dossier.

Crypter les mots de passe

Voici un petit utilitaire vous permettant de crypter vos mots de passe en ligne :

Dans un fichier php nommée par exemple “cryptmdp.php”, insérer le code suivant :

<p>
<?php
if (isset($_POST['login']) AND isset($_POST['pass'])) // Si on a renseigner le login et le mot de pass
{
    $login = $_POST['login'];
    $pass_crypte = crypt($_POST['pass']); // On crypte le mot de passe

    echo 'Ligne &agrave; copier dans le .htpasswd :<br />' . $login . ':' . $pass_crypte;
}

else // On n'a pas encore rempli le formulaire
{
?>
</p>

<p>Entrez votre login et votre mot de passe pour le crypter.</p>

<form method="post">
    <p>
        Login : <input type="text" name="login"><br />
        Mot de passe : <input type="text" name="pass"><br /><br />
  
        <input type="submit" value="Crypter !">
    </p>
</form>

<?php
}
?>

source : http://www.siteduzero.com/tutoriel-3-14649-proteger-un-dossier-avec-un-htaccess.html#ss_part_2

Empêcher l'accès à un répertoire par un domaine

La syntaxe pour bloquer l'accès d'un répertoire par un domaine est la suivante :

Allow (all, [liste de domaine])
Deny (all, [liste de domaine])
Order (Allow,Deny ou Deny,Allow)
Order Deny, Allow
Deny from .LeNomDuDomaine.com

Toutes les personnes (requêtes) provenant du domaine .LeNomDuDomaine.com ne pourront avoir accès aux ressources comprises dans le répertoire et ses sous-répertoires. La commande Order sert à préciser explicitement que la commande Deny va bien annuler l'effet de Allow et non l'inverse.

Empêcher l'accès à un répertoire ou à un site excepté pour une adresse IP

Voici un exemple de restriction d'accès :

ErrorDocument 403 http://www.votre_site.com/accesrefuse.html
Order deny,allow
allow from 123.123.123.123
Deny from all

Dans ce cas, l'accès ne sera possible que pour l'adresse IP 123.123.123.123

Empêcher l'accès à un fichier particulier

Par défaut, Apache applique les restrictions du fichier .htaccess à l'ensemble des fichiers du répertoire dans lequel il se trouve ainsi qu'à tous les fichiers contenus dans ses sous-répertoires.

Il est également possible de restreindre l'accès pour un ou plusieurs fichiers du répertoire grâce à la balise <Files>.

Voici un exemple de restriction aux fichiers admin.php3 et admin2.php3 :

<Files admin.php3>
AuthUserFile /repertoire/de/votre/fichier/.FichierDeMotDePasse
AuthGroupFile /dev/null
AuthName "Accès sécurisé au site"
AuthType Basic
require user JFPillou
</Files>
<Files admin2.php3>
AuthUserFile /repertoire/de/votre/fichier/.FichierDeMotDePasse
AuthGroupFile /dev/null
AuthName "Accès sécurisé au site"
AuthType Basic
require user JFPillou
</Files>

Il faut utiliser une seule balise <Files> par fichier. Sinon, l'erreur suivante est reportée dans le fichier de log des erreurs :

.htaccess: Multiple arguments not (yet) supported.

Pour info, il faut ajouter que depuis Apache 1.3, il est conseillé d'utiliser la balise <FilesMatch> à la place de la balise <Files>. Cette nouvelle balise ne supporte aussi qu'un seul argument mais on peut traiter plusieurs fichiers grâce à une expression régulière.

Empêcher l'accès à un type de fichiers par un domaine

<Files *.png>
Order Deny, Allow
Deny from .LeNomDuDomaine.com
</Files>

Toutes les personnes (requêtes) provenant du domaine .LeNomDuDomaine.com ne pourront avoir accès aux images, dont l'extension est .png, comprises dans le répertoire et ses sous-répertoires.

Autoriser l'accès à un groupe de fichiers par un domaine et un pays

<Files php*>
Order Allow, Deny
Deny from all
Allow from .phpfrance.com
Allow from .fr
</Files>

Toutes les personnes (requêtes) provenant du domaine .phpfrance.com ou des domaines ayant la terminaison .fr pourront avoir accès aux fichiers commençant par php (par exemple, les fichiers phpbonjour.html, phpaurevoir.vxf) compris dans le répertoire et ses sous-répertoires. Protéger un répertoire par un login

Cette méthode (beaucoup moins sûre que la précédente) permet une authentification de bas niveau uniquement par le nom de l'utilisateur. La syntaxe est la suivante :

Require (user [liste des utilisateurs], group [liste des groupes], valid-user)

Voici un exemple de ligne du fichier .htaccess :

Require User Damien Comma PumpPHP Jeff Rastapaye

Tout utilisateur souhaitant rentrer dans le répertoire ou un de ses sous-répertoires sera refusé sauf s'il s'identifie en donnant un nom figurant dans la liste.

Obliger un utilisateur à satisfaire à au moins une des conditions

Voici la syntaxe :

Satisfy (any, all)
Order Allow, Deny
Deny from all
Allow from .free.fr
Require User Damien Comma PumpPHP Jeff Rastapaye
Satisfy Any

Ce qui signifie que l'accès au répertoire sera bloqué pour tout le monde à l'exception des personnes qui s'identifient et des requêtes provenant du domaine .free.fr. Gérer les types de fichiers

Un type MIME (en anglais MIME type) est un ensemble de types de fichiers standard, permettant d'associer une extension de fichier donnée à une application, afin d'automatiser le lancement de l'application.

Ajouter un Mime-Type à un répertoire

La syntaxe est la suivante :

AddType (mime/type [liste d'extension])

Voici un exemple de mise en oeuvre du fichier .htaccess :

AddType image/x-photoshop PSD
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .htm

Le serveur enverra au navigateur Internet le fichier en lui disant de lancer le programme PhotoShop (s'il est installé sur votre machine) et de lui donner le fichier.

Habituellement, ceci est utilisé pour des fichiers nécessitant un Plug-In particulier non reconnu par votre navigateur.

Cette commande permet aussi d'annuler tout élément prédéfini. Ainsi, vous pouvez enregistrer un fichier .wav avec une extension .gif et préciser au navigateur de considérer les fichiers .gif comme des fichiers audio !

En pratique, on pourra donc utiliser cette commande pour ordonner à PHP de parser d'autres extensions de fichier, .htm par exemple.

Forcer tous les fichiers d'un répertoire à un Mime-Type

Voici la syntaxe à adopter :

ForceType (mime/type)

Par exemple avec la ligne suivante, tous les fichiers du répertoire contenant le fichier .htaccess seront considérés comme étant des fichiers .jpg quelle que soit leur extension :

ForceType image/jpg

Ce type de commande ne peut être utilisé dans les bornes ! Définir les extensions de fichiers par défaut

La syntaxe à suivre est :

DefaultType (mime/type)

Par exemple

DefaultType text/html

Cette option vous permet de définir le comportement par défaut du navigateur face à des extensions lui étant inconnues. Ici, il prendra tout fichier inconnu (par exemple 'bonjour', 'Rastapaye.phpfrance') en tant que document HTML.

Personnalisation des messages d'erreurs

Il s'agit d'une fonctionnalité pratique car elle permet de définir une page par défaut pour un type d'erreur donné (Voir l'ensemble des codes d'erreur et leur signification)…

Cela permet d'une part de guider l'utilisateur au lieu d'afficher la banale page d'erreur du navigateur, ainsi que d'égayer la navigation même en cas d'erreur.

ErrorDocument (code-à-3-chiffres [nom du fichier ou texte ou url])

Les deux lignes suivantes permettent de définir des pages d'erreurs personnalisées au cas où l'accès à un document serait interdit ou bien que le document n'existe pas :

ErrorDocument 403 /erreurs/403.html
ErrorDocument 404 /erreurs/404.html

Ceci vous permet de donner un message d'erreur personnalisé remplaçant les fichiers fournis avec le navigateur.

Voici quelques-unes des erreurs les plus courantes à personnaliser :

  • 401 Unauthorized : la personne n'a pas passé avec succès l'identification.
  • 403 Forbidden : le serveur n'a pas le droit de répondre à votre requête.
  • 404 Not Found : le serveur n'a pas trouvé le document souhaité.

Changer le fichier index par défaut

Le fichier index est le fichier qui est affiché lorsque aucun nom de fichier n'est défini dans l'URL (par exemple http://www.monserveur.com/repertoire). Cela permet d'éviter que le navigateur liste l'ensemble des fichiers contenus dans le répertoire (pour des raisons de confidentialité).

La syntaxe pour effectuer ce type d'opération est la suivante :

DirectoryIndex (fichiers)

Voici un exemple de mise en application :

DirectoryIndex index.php index.html index.phtml /erreurs/403.php

Lorsque vous essayez d'accéder au répertoire sans préciser la page à afficher, Apache va avoir recours à la directive DirectoryIndex. En général, par défaut, cette directive pointe vers index.html puis index.htm.

Dans l'exemple ci-dessus, Apache va commencer par chercher index.php, puis index.html, et ensuite index.phtml. Si aucun de ces trois fichiers existent, la page 403.php (se trouvant dans la racine) sera affichée pour éviter de lister le répertoire.

Quelques réécritures d'URL

0) En premier lieu, avant d'utiliser les directives RewriteCond ou RewriteRule, il faut activer le moteur des réécritures d'URL avec la ligne suivante qui doit être présente dans le fichier (.htaccess) qu'une seule fois :

RewriteEngine On

1) Pour rediriger les internautes ainsi que les robots sur le même site mais en utilisant les “www.” sur le protocole “https” :

RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*) https://www.example.com/$1 [QSA,L,R=301]

2) Forcer le protocole HTTPS (fonctionne seulement si le nom de domaine possède un certificat SSL) :

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]

3) Rediriger un site sous un nom de domaine de FSH vers un même et unique TLD (ici on voudra par exemple le .fr) :

RewriteCond %{HTTP_HOST} !^monsite.franceserv.fr$
RewriteRule ^(.*) https://monsite.franceserv.fr/$1 [QSA,L,R=301]

Il est également possible de définir le TLD à privilégier directement dans votre interface de gestion après avoir cliqué sur la bille de couleur en face de l'adresse du site concerné.

4) Rediriger les internautes de tout le site vers un autre site :

Redirect permanent / https://www.exemple.com

5) Rediriger les internautes d'une page vers une autre page :

Redirect permanent /ancienne_page.html /nouvelle_page.html

Bien que les directives Redirect permettent de rediriger les internautes, elles n'utilisent pas le moteur de la réécriture d'URL.

Crédits

Tutorial écrit par Jean-François Pillou et Douglas Six puis corrigé et adapté par et pour FranceServ Hébergement.