Apprendre .htaccess : Introduction

Le fichier .htaccess permet de modifier la configuration d'un serveur web via l'écriture de règles.

Icône de calendrier
Avancé
7 chapitres

Qu’est-ce qu’un fichier .htaccess ?

Le fichier 📄 .htaccess est utilisé afin de modifier la configuration d’un serveur web Apache sans avoir à modifier directement les fichiers de configuration du serveur.

Il contient des règles, permettant par exemple de :

  • Personnaliser les pages d’erreur (404, 500…)
  • Effectuer des redirections
  • Protéger des ressources
  • Contrôler l’accès au site
  • Réécrire des URLs
  • Etc.

Comment créer un fichier .htaccess ?

La création d’un fichier 📄 .htaccess est simple puisqu’elle ne nécessite que la création d’un fichier nommé « .htaccess ».

On place généralement un fichier 📄 .htaccess global à la racine du serveur web, mais notez qu’il est toutefois possible de définir des règles propres à un répertoire spécifique en y plaçant un fichier 📄 .htaccess dédié.

Les règles spécifiées dans ce fichier s’exécuteront les unes après les autres. Leur ordre est donc à considérer.

.htaccess
# Règle 1
...

# Règle 2
...

Écrire ses premières règles dans un fichier 📄 .htaccess nécessite de comprendre 2 concepts : les directives et les sections de configuration.

Directives

Une règle est définie par une directive suivie d’un ou plusieurs arguments selon le schéma suivant : directive arg1 arg2 ....

Une directive est déterminée par un mot-clé spécifique. Ces directives sont listées sur la documentation officielle d’Apache.

.htaccess
copié !
# Utilisation de la directive SetEnv pour déclarer une variable d'environnement
SetEnv BASEPATH /foo/bar

Si une même directive est déclarée dans deux fichiers 📄 .htaccess situés dans des répertoires distincts, alors la directive étant déclarée au niveau d’arborescence le plus profond écrasera l’autre.

📁 foo
 | 📄 .htaccess
 | 📁 bar
 |  | 📄 .htaccess

Ici, c’est le fichier 📄 .htaccess présent dans 📁 bar qui aura le dernier mot.

Sections de configuration

Rôle

Par défaut, les règles déclarées dans un fichier 📄 .htaccess s’appliquent aux répertoires descendants. Néanmoins, il est possible d’en modifier la portée via l’usage de sections de configuration (aussi appelées « conteneurs »).

Ces conteneurs se traduisent par des balises XML qui vont regrouper un ensemble de règles. Ces balises vont contenir des arguments afin de spécifier leur fonctionnement.

.htaccess
copié !
<conteneur1 arg1>
	# Mes règles...
	<conteneur2 arg1 arg2>
		# Mes règles...
	</conteneur2>
</conteneur1>

<conteneur3 arg1>
	# Mes règles...
</conteneur3>

Ces conteneurs se divisent en 2 familles, en fonction du moment où ils sont évalués : au démarrage / redémarrage du serveur ou à chaque requête.

Évaluation au démarrage / redémarrage du serveur

Ces conteneurs sont au nombre de trois : <IfDefine>, <IfModule> et <IfVersion> et ne seront évalués qu’au démarrage et au redémarrage du serveur. Il s’agit de conteneurs conditionnels.

  • Si leurs conditions sont vérifiées au démarrage, les directives qu’ils contiennent s’appliqueront à l’ensemble des requêtes.
  • Si leurs conditions ne sont pas vérifiées, les directives qu’ils contiennent seront ignorées.

<IfDefine>

Les directives contenues dans cette section ne s’appliqueront que si un paramètre spécifique est défini au démarrage du serveur (via la commande httpd). Cette commande accepte plusieurs paramètres.

Si le serveur est démarré avec httpd -DReverseProxy ... alors les directives définies dans la section <IfDefine ReverseProxy> seront exécutées :

.htaccess
copié !
<IfDefine ReverseProxy>
	# Mes règles...
</IfDefine>

<IfModule>

Les directives contenues dans cette section ne s’appliqueront que si un module est défini au niveau du serveur. Ce module peut être spécifié par :

  • Un identificateur (ex : rewrite_module)
  • Le nom du fichier source correspondant (ex : mod_rewrite.c)
.htaccess
copié !
<IfModule mod_rewrite.c>
	# Mes règles...
</IfModule>

<IfVersion>

Les directives contenues dans cette section ne s’appliqueront que si la version de httpd satisfait aux critères spécifiés.

.htaccess
copié !
<IfVersion >= 2.4>
	# Mes règles...
</IfVersion>

De nombreux opérateurs permettent de spécifier cette version.

Évaluation à chaque requête

Tous les autres conteneurs seront évalués à chaque requête.

Les directives qu’ils contiennent s’appliqueront seulement aux requêtes qui sont concernées par le conteneur.

Système de fichiers <Directory> et <Files>

Les conteneurs <Directory> et <Files> appliquent des directives à certaines parties du système de fichiers.

<Directory>

Les directives contenues dans cette section s’appliquent au répertoire précisé, ainsi qu’à tous ses sous-répertoires et aux fichiers que ces derniers contiennent.

copié !
<Directory "/foo/bar">
	# Mes règles...
</Directory>
<Files>

Les directives contenues dans cette section s’appliquent à tout fichier spécifié, quel que soit le répertoire dans lequel il se trouve.

.htaccess
copié !
<Files "foo.php">
	# Mes règles...
</Files>

Arborescence du site web <Location>

Le conteneur <Location> applique des directives à certaines parties de l’arborescence d’un site web.

copié !
<Location "/admin">
	# Mes règles...
</Location>

Expressions booléennes <If>, <ElseIf> et <Else>

Le conteneur <If> applique des directives en fonction d’une condition qui peut être définie sous la forme d’une expression booléenne.

Si cette condition n’est pas vérifiée, alors les conteneurs <ElseIf> et <Else> pourront initier un traitement alternatif.

.htaccess
copié !
<If "%{HTTP_HOST} == 'example.com'">
	# Mes règles...
</If>
<ElseIf "%{HTTP_HOST} == 'www.example.com'">
	# Mes règles...
</ElseIf>
<Else>
	# Mes règles...
</Else>

Ici, HTTP_HOST fait référence au nom d’hôte (= nom de domaine).

Les variables serveurs les plus utiles
VariableDescriptionExemple
DOCUMENT_ROOTRacine du serveur (définie par la directive DocumentRoot)./var/www/html/
HTTP_COOKIECookies envoyé par le client.90plan=R3276214363; _gid=GA1.2.1163156300.1539840846; _gat_gtag_UA_12961733_1=1
HTTP_HOSTNom du serveur demandé.https://laconsole.dev
HTTPSon si la requête utilise https, sinon off.on
HTTP_REFERERLien référant si existant.www.google.com/?q=demo
HTTP_USER_AGENTIdentifiant du client.Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:62.0) Gecko/20100101 Firefox/62.0
QUERY_STRINGParamètres GET passés dans l’url.?category=book&order=asc
REQUEST_FILENAMEChemin absolu de la ressource demandée./home/thibaud/www/index.php
REQUEST_METHODMéthode HTTP de la requête entrante.GET, POST, PATCH
REQUEST_SCHEMEProtocole de la requête.http, https
REQUEST_URIRessource demandée./blog/apache
SCRIPT_FILENAMEIdentique à REQUEST_FILENAME./home/thibaud/www/laconsole/index.php
THE_REQUESTRequête complète.GET /index.php HTTP/1.1

Vous trouverez ici l’intégralité des variables disponibles ainsi que des exemples d’expressions.

L’ensemble des conteneurs est listé sur la documentation officielle d’Apache.

Nous allons aborder dans les leçons suivantes les règles de base du fichier 📄 .htaccess.