Htaccess – Présentation

Un fichier HTACCESS est un fichier de configuration Apache qui fournit un mécanisme pour autoriser les modifications de configuration pour différents dossiers/répertoires d’un site Web. Il comprend des directives de configuration applicables au répertoire et aux sous-répertoires. Un fichier HTACCESS effectue un certain nombre de vérifications telles que la définition de la page d’index d’un site Web, la liste de la page d’erreur 404 (Page non trouvée), l’exécution des redirections de page 301 ou 302, le blocage de l’accès à partir d’une adresse IP spécifique ou d’autres sites Web.

Présentation

Présentation

On peut l’utiliser des fichiers Htaccess pour protéger une partie du site en n’autorisant l’accès qu’à des utilisateurs déclarés, créer des pages d’erreurs personnalisées, modifier des url, rediriger des visiteurs vers une autre page.

Portée de son fonctionnement :

Un fichier htaccess placé dans un répertoire du site agit à l’intérieur de se dossier mais également dans tous les sous-répertoires contenus dans le dossier en question.

Si dans un sous-dossier il existe un fichier htaccess qui propose d’autres commandes, alors le contenu de ce fichier htaccess viendra s’ajouter à celui de son(ses) parent(s) (Addition des commandes).

Par contre, si une règle dans le répertoire enfant contredit celle dictée dans un dossier parent, alors la règle prise en compte sera celle de l’enfant. Par contre la règle du parent, dans son répertoire sera conservée dans le contexte parent.

Affichage d’une page d’erreur personnalisée

Affichage d’une page d’erreur personnalisée

On fonctionne en statique, c’est-à-dire que l’on accède directement aux pages html dans les liens. On essai d’accéder à une page inconnue :

Exercice :

On désire afficher une page d’erreur personnalisée lorsque l’on tente d’accéder à une page inexistante.

Solution proposée :

On va créer une page html nommée « 404.html » dans laquelle on va écrire « ERREUR 404 ». Bien sur, cette page ultra basique est à améliorée.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Formation Htaccess</title>
</head>

<body>
<h1 align="center">ERREUR 404</h1>
</body>
</html>

On créé à la racine du site un fichier texte nommé « .htaccess ». On édite ce fichier et on demande au serveur Apache de router les erreur de type 404 vers un fichier particulier (ici, « 404.html »).

On ajoute donc la ligne suivante :

ErrorDocument 404 /htaccess/404.html

Résultat :

Désormais, lorsque l’on veut afficher une page inconnue, on affiche l’écran suivant.

Redirection de fichier

Redirection de fichier

On a l’architecture de site suivant :

Architecture du site test

Ce que l’on veut faire :

Si on tente d’accéder à la page /htaccess/site/page-1.html on redirige la demande vers le fichier /htaccess/site/sous-dossier/new.html

Dans  le fichier htaccess on ajoute la ligne :

RedirectPermanent  /htaccess/site/page-1.html http://localhost/htaccess/site/sous-dossier/new.html

Informations complémentaires :

# redirection d'un site complet
#   Attention à ne pas oublier le slash qui localise la racine du site, et celui qui termine la ligne de commande.
RedirectPermanent / https://www.webodesign.net/

# redirection d'un répertoire
RedirectPermanent /htaccess/site http://localhost/htaccess/site2
Remplacement des commandes

Remplacement des commandes

Dans le répertoire /htaccess/site on avait créé un fichier .htaccess contenant une personnalisation de page d’erreur : ERREUR 404

Dans le répertoire /htaccess/site2 on créé un fichier .htaccess contenant une personnalisation de page d’erreur : ERREUR 404 N.2

  • /htaccess/toto.html affichera la page d’erreur « ERREUR 404 »
  • /htaccess/site/toto.html affichera la page d’erreur « ERREUR 404 »
  • /htaccess/site2/toto.html affichera la page d’erreur « ERREUR 404 N.2»

Remarque : se référer à la figure présentant l’architecture du site.

Protection htaccess par authentification

Protection htaccess par authentification

On rajoute le dossier « admin » dans lequel on veut installer une protection d’accès par login / mot de passe (se référer à la figure présentant l’architecture du site).

1- On créé le fichier index.html

Celui-ci ne sera accessible que lorsque l’utilisateur se sera identifié avec un mot de passe correct.

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Formation Htaccess</title>
 </head>
 <body>
   <h1 align="center">ADMIN</h1>
   <p><b>Vous avez été correctement identifié</b></p>
 </body>
</html>

2. Ecriture du fichier .htaccess

Dans le répertoire admin, on créé un fichier .htaccess avec sont contenu

# Texte affiché dans la fenêtre d'authentification login/password
AuthName "Zone admin"

# Définition du type d'authentification proposé
AuthType Basic

# Chemin menant au fichier .htpasswd
AuthUserFile C:\laragon\www\htaccess\admin\.htpasswd

# N'acceptera que des utilisateurs déclarés et autorisés
Require valid-user

3. Détermination du chemin absolu et chiffrement du mot de passe

On va créer un fichier « toto.php » temporairement qui aura deux  fonctions :

  • Demander l’affichage du chemin réel menant l’accès au répertoire « admin ». Ce chemin sera a copié dans le fichier .htaccess à côté de AuthUserFile (remplace chemin_absolu_vers_le_fichier_.htpasswd).
  • Créé et afficher une clé chiffrée du mot de passe (içi « essai »).
  • https://bcrypt-generator.com/
<?php
	echo realpath('toto.php');
	echo("<br>");
	// Methode à utiliser sur Linux (ne fonctionne pas sous Windows)
	echo crypt('essai');
	echo("<br>");
	// Méthode à utiliser sur Windows
	echo password_hash('essai', PASSWORD_BCRYPT);
?>

L’url http://localhost/admin/toto.php renvoie la page suivante :

  • On copie le chemin et on le colle dans le fichier .htaccess à la droite de AuthUserFile.
  • On remplace toto.php par .htpasswd

On copie la clé chiffrée correspondant au mot de passe « essai ».

4. Mise en place du fichier .htpasswd

On modifie le fichier .htpasswd dans lequel on va renseigner les paires :

Nom_utilisateur:Clé_de_chiffrement_du_mot_de_passe

Exemple : on attribue à l’utilisateur « toto » la clé chiffrée du mot de passe « essai »

toto:$2y$10$0Pa6vhErAMb5Ih6BK9f9du11ThRxA.DcYu.Yx3GLAcgCvIM1VJTJG

5. Résultat

Si l’on accède à l’url « http://localhost/admin », on se voit invité de saisir un nom utilisateur ainsi que son mot de passe pour ouvrir l’autorisation d’accès à la page « index.html » (Remarque : la page affiche ADMIN).

Réécriture d’url (url rewriting)

Réécriture d’url (url rewriting)

On créé un dossier « ecriture » dans l’arborescence :

Architecture du site test

Dans un premier temps on créé un fichier « index.php » qui a pour fonction d’afficher dans le navigateur « Article N.x » avec x égal au numéro d’id passé en paramètre dans l’url :

http://localhost/htaccess/ecriture/index.php?id=2

Le fichier index.php à le contenu suivant :

<!doctype html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>Formation Htaccess</title>
   </head>
   <body>
     <h1 align="center">Article N.<?php echo $_GET['id']; ?></h1>
   </body>
</html>

On voudrait pouvoir entrer une url type http://localhost/htaccess/ecriture/article-2.html qui afficherait Article N.2 (2 est un exemple mais l’exercice doit fonctionner avec n’importe quel autre chiffre).

On peut justement utiliser le fichier « index.php » listé ci-dessus ; il faudrait lui passer la valeur 2 en paramètre ; on peut le faire en ajoutant « ?id=2 » à la fin de l’url.

Le but est de créer un fichier htaccess qui a pour but de réécrire la partie d’url « article-2.html » et « index.php?id=2 »

# On demarre le moteur de réécriture
RewriteEngine On

# Règle de réécriture
RewriteRule article-([0-9]+).html index.php?id=$1 [L]

[0-9] : indique en expression régulière : capture à cet endroit après article-)un chiffre entre 1 et 9

[0-9]+ : la capture va pouvoir capturer d’autres chiffres (101, 22, …)

([0-9]+) : ce qui a été capturé mise entre parenthèses va être stocké dans un variable $1 (première variable créée. Si on rajoute d’autres parenthèses on aurait $2, $3, …)

[L] : est un flag (drapeau) qui indique la dernière règle de réécriture.

Résultat final : L’url http://localhost/ecriture/article-3 renvoie la page suivante :