Apprendre .htaccess : Introduction
Le fichier .htaccess permet de modifier la configuration d'un serveur web via l'écriture de règles.
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.
# 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.
# 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.
<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 :
<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
)
<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.
<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.
<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.
<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.
<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.
<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
Variable | Description | Exemple |
---|---|---|
DOCUMENT_ROOT | Racine du serveur (définie par la directive DocumentRoot). | /var/www/html/ |
HTTP_COOKIE | Cookies envoyé par le client. | 90plan=R3276214363; _gid=GA1.2.1163156300.1539840846; _gat_gtag_UA_12961733_1=1 |
HTTP_HOST | Nom du serveur demandé. | https://laconsole.dev |
HTTPS | on si la requête utilise https, sinon off. | on |
HTTP_REFERER | Lien référant si existant. | www.google.com/?q=demo |
HTTP_USER_AGENT | Identifiant du client. | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:62.0) Gecko/20100101 Firefox/62.0 |
QUERY_STRING | Paramètres GET passés dans l’url. | ?category=book&order=asc |
REQUEST_FILENAME | Chemin absolu de la ressource demandée. | /home/thibaud/www/index.php |
REQUEST_METHOD | Méthode HTTP de la requête entrante. | GET , POST , PATCH … |
REQUEST_SCHEME | Protocole de la requête. | http , https |
REQUEST_URI | Ressource demandée. | /blog/apache |
SCRIPT_FILENAME | Identique à REQUEST_FILENAME. | /home/thibaud/www/laconsole/index.php |
THE_REQUEST | Requê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
.