Restreindre l'accès par login / mot de passe

C'est une des utilisations courantes du htaccess. Cela permet de réserver certaines parties d'un site web à certaines personnes d'une manière facile, rapide et fiable.

Le contenu du fichier .htaccess :

.htaccess

 AuthUserFile "/xxx/xxx/.htpasswd" 
 AuthGroupFile "/xxx/xxx" 
 AuthName Authentification 
 AuthType Basic 
 <Limit GET POST> 
 require user Daniel 
 require user Bernard 
 </Limit>

AuthName indique le domaine d'identification. Ce nom sera affiché dans la fenêtre d'authentification

AuthType indique le type d'identification qui sera utilisée. Il est possible de choisir basic ou digest, ce dernier offre l'avantage de ne pas transmettre le mot de passe en clair sur le réseau.

AuthUserFile et AuthGroupFile indiquent respectivement l'emplacement du fichiers des utilisateurs et des groupes. Pour ma part je me contente de définir des utilisateurs. require peut être suivi de valid-user pour n'importe quel utilisateur défini dans le fichier passwd, de user et du nom d'un utilisateur ou de group et du nom d'un groupe afin que ses membres bénéficient de l'accès.

Générer les mot de passe utilisateurs dans le fichier .htpasswd :

Sous Linux, il suffit d'utiliser htpasswd qui est fourni avec Apache.

htpasswd [option] Chemin-du-fichier-htpasswd nom-utilisateur l'utilitaire demandera la saisie du mot de passe et sa confirmation.

les options :

-c pour créer un nouveau fichier utilisateurs (attention à ne pas écraser un fichier existant)

-b pour empêcher le chiffrement du mot de passe dans le fichier

-m, -s ou -p indiquent l'algorithme de chiffrement à utiliser : MD5, SHA ou texte brut

Fichier d'utilisateurs

Bernard:INmsgXRs1Jrp
Jo:INCOMIEKoURCQ
Marco:INCfhO9AT/Muw
Robert:INYCtEpsjrBzc

Fichier d'utilisateurs

Bernard:romeo
Jo:albert
Marco:papagaga
Robert:exemple

Dans un contexte d'adresses ip fixes ou de noms de machines qui ne changent pas, il est possible de filtrer les accès à certains dossiers sur ces critères. Pour ma part, je ne suis pas persuadé de l'efficacité de ce système, tant il est facile de changer le nom d'un PC ou de passer par un proxy pour masquer son adresse IP réelle. Je ne la conseille donc pas pour gérer la sécurité d'accès à des données sensibles, du moins pas sans une identification par login / mot de passe en complément.

Cette technique peut toutefois être fonctionnellement avantageuse, tout dépend des besoins.

Il y a 3 directives à connaître, c'est extrêmement simple : order, deny et allow. La directive order définit l'ordre dans lequel on prendra en compte les directives deny et allow, c'est là le plus important.

Ces deux exemples donneront exactement le même résultat : Exemple 1

Order Deny,Allow 
Allow from 192.168.0.2 
Deny from all

Exemple 2

 Order Deny,Allow 
 Deny from all
 Allow from 192.168.0.2 

warning Il n'y a pas d'espace dans Deny,Allow ou Allow,Deny c'est particulièrement important dans la version 2 d'apache qui n'accepte qu'un argument pour la clause Order. Dans cet exemple, on passe d'abord la directive deny sur tout le monde et ensuite la directive allow pour l'adresse IP 192.168.0.2 qui sera la seule à pouvoir accéder au dossier où se trouve le fichier htaccess (et aux fichiers et sous dossiers qu'il contient).

À la place d'une adresse ip indiquer on peut indiquer (pour les directives allow et deny) : Un nom de domaine, même partiel

Deny from .domaine.net

Des masques d'adresses ip

Deny from 192.168.1 
Deny from 192.168.1.0/255.255.255.0

Ces directives utilisables dans un fichier htaccess le sont aussi dans le fichier de configuration Apache dans la définition des alias.

Il est possible de personnaliser les pages / messages d'erreur qui seront affichées en cas d'erreur. La plus connue de ces erreurs est le fameux code 404 qui indique qu'une page / ressource n'a pas été trouvée. Les déclarations sont extrêmement simples.

ErrorDocument 403 "Accès à ce répertoire non autorisé".
ErrorDocument 404 404.html
ErrorDocument 500 http://www.site.net/error/500.html

Le tout est de connaître les codes d'erreurs pour lesquels on souhaite personnaliser une page. Les principaux codes HTTP sont les suivants :

400 Bad Request
401 Authorization Required
402 Payment Required
403 Forbidden
404 Not Found
407 Proxy Authentication Required
415 Unsupported Media Type
500 Internal Server Error
503 Service Temporarily Unavailable
504 Gateway Time-out
505 HTTP Version Not Supported
507 Insufficient Storage

Parfois, il peut être plus pratique de laisser la navigation dans un dossier sous forme d'index de fichiers plutôt que de faire une page. Par exemple si on veut proposer une quantité importante de fichiers accessibles, que ce soit en téléchargement ou en consultation, et à plus forte raison si on est amené à en ajouter, retirer ou modifier (le nom souvent).

Afin d'améliorer un peu le visuel, il est possible de personnaliser la description des fichiers affichés dans l'index ainsi que l'icône qui leur est associée. Exemple de htaccess

 AddDescription "Fichier texte, affichable" *.txt
 AddDescription "Fichier PDF, à télécharger" *.pdf
 AddDescription "Archive ZIP, à télécharger" *.zip
 AddIcon http://cchatelain.developpez.com/htaccess/pdf.jpg pdf
 AddIcon http://cchatelain.developpez.com/htaccess/txt.jpg txt
 AddIcon http://cchatelain.developpez.com/htaccess/zip.jpg zip
 AddIcon http://cchatelain.developpez.com/htaccess/win.jpg ^^DIRECTORY^^
 AddIcon http://cchatelain.developpez.com/htaccess/rien.jpg ^^BLANKICON^^

Résultat :

index personnalisé

Explication :

  • la directive AddDescription, comme son nom l'indique, ajoute une description en fonction de l'extension du fichier. Sa syntaxe est AddDescription “<texte à afficher>” <extension>
  • la directive AddIcon, elle, associe une image (qui sera utilisée en icône dans la liste de fichier) à une extension. Sa syntaxe est AddIcon <url de l'image> <extension>

warning Attention à ne pas choisir d'images qui prennent trop de place, sinon l'index des fichiers serait particulièrement désagréable à parcourir. Il est aussi possible d'utiliser le type mime du fichier pour faciliter le travail quand, par exemple, on veut appliquer le même traitement à plusieurs extensions. On peut ajouter des types mime comme suit : Définition de types mime

  AddType text/html 	htm html shtml

Il ne reste plus qu'à leur associer leur icône. Personnalisation de l'icone d'un type mime

 AddIconByType text/html http://cchatelain.developpez.com/htaccess/html.jpg

La liste des types mime est présentée en annexe.

On peut aussi personnaliser d'autres éléments de l'affichage comme l'en-tête, que l'on peut gérer dans un fichier html par exemple. Remplacement de l'entête

HeaderName entete.html

Cela prendra le fichier entete.html de chaque dossier pour personnaliser l'entête des index de fichiers. Afin de protéger les fichiers qui ne doivent pas être listés on ajoutera la directive :

IndexIgnore entete.html

En effet, nous n'avons aucun intérêt à présenter ce fichier au public. Et enfin, voyons l'ordre de tri des fichiers. Nous utiliserons pour cela ce type de directives :

IndexOrderDefault Ascending
IndexOrderDefault Ascending Date
IndexOrderDefault Ascending Size
IndexOrderDefault Ascending Description
IndexOrderDefault Descending 
IndexOrderDefault Descending Date
IndexOrderDefault Descending Size
IndexOrderDefault Descending Description

Un site web, normalement, est vivant. Il est amené à évoluer et à changer, y compris dans l'organisation et l'emplacement des documents. Dans ce cas, pour que les anciens liens qui ont référencés un peu partout ne se transforment pas en liens morts, on gère des redirections, c'est à dire que les requêtes HTTP adressées aux anciennes adresses vont être redirigées vers les nouvelles. Dans le cas d'une structure simple, pas de souci. Par exemple dans le cas de cet article (adressé sur l'url http://cchatelain.developpez.com/articles/web/Apache/htaccess/), c'est en fait le fichier index.php (fichier lu par défaut par Apache) qui est utilisé. Il suffirait de le changer par :

 <HTML> 
 <HEAD> 
 <META HTTP-EQUIV="refresh" Content="0;URL=<nouvelle URL>"> 
 </HEAD> 
 </HTML> 

Sur le principe de : faq Comment faire une redirection ? Et le tour est joué. Mais on peut avoir des cas plus complexes à gérer : des redirections de fichiers, ainsi que dossiers complets et peut-être même de domaines…. On ne peut pas mettre autant de fichiers redirecteurs qu'on avait de documents… On va donc utiliser la directive RedirectPermanent dans le htaccess. Pour un fichier

 RedirectPermanent /dossier/ancienfichier.ext http://cchatelain.developpez.com/articles/web/Apache/htaccess/

Pour un dossier

 RedirectPermanent /dossier http://cchatelain.developpez.com/articles/web/Apache/htaccess/

Pour un domaine

RedirectPermanent / http://cchatelain.developpez.com/articles/web/Apache/htaccess/

Notons que, pour l'ancien fichier / dossier, on met le chemin depuis la racine de son site et que, pour le nouveau chemin, à savoir la redirection, on met l'url complète.

Type Description Extensions

application/acad Fichiers AutoCAD dwg

application/clariscad Fichiers ClarisCAD ccad

application/drafting Fichiers MATRA Prelude drafting drw

application/dxf Fichiers AutoCAD dxf

application/i-deas Fichiers SDRC I-deas unv

application/iges Format d'échange CAO IGES igs, iges

application/octet-stream Fichiers binaires non interprétés bin

application/oda Fichiers ODA oda

application/pdf Fichiers Adobe Acrobat pdf

application/postscript Fichiers PostScript ai, eps, ps

application/pro_eng Fichiers ProEngineer prt

application/rtf Format de texte enrichi rtf

application/set Fichiers CAO SET set

application/sla Fichiers stéréolithographie stl

application/solids Fichiers MATRA Solids dwg

application/step Fichiers de données STEP step

application/vda Fichiers de surface vda

application/x-mif Fichiers Framemaker mif

application/x-csh Script C-Shell (UNIX) dwg

application/x-dvi Fichiers texte dvi dvi

application/hdf Fichiers de données hdf

application/x-latex Fichiers LaTEX latex

application/x-netcdf Fichiers netCDF nc, cdf

application/x-sh Script Bourne Shell dwg

application/x-tcl Script Tcl tcl

application/x-tex fichiers Tex tex

application/x-texinfo Fichiers eMacs texinfo, texi

application/x-troff Fichiers Troff t, tr, troff

application/x-troff-man Fichiers Troff/macro man man

application/x-troff-me Fichiers Troff/macro ME me

application/x-troff-ms Fichiers Troff/macro MS ms

application/x-wais-source Source Wais src

application/x-bcpio CPIO binaire bcpio

application/x-cpio CPIO Posix cpio

application/x-gtar Tar GNU gtar

application/x-shar Archives Shell shar

application/x-sv4cpio Archives Shell sv4cpio

application/x-sv4crc CPIO SVR4 avec CRCl sc4crc

application/x-tar Fichiers compressés tar tar

application/x-ustar Fichiers compressés tar Posix man

application/zip Fichiers compressés ZIP man

audio/basic Fichiers audio basiques au, snd

audio/x-aiff Fichiers audio AIFF aif, aiff, aifc

audio/x-wav Fichiers audio Wave wav

image/gif Images gif man

image/ief Images exchange format ief

image/jpeg Images Jpeg jpg, jpeg, jpe

image/tiff Images Tiff tif, tiff

image/x-cmu-raster Raster cmu cmu

image/x-portable-anymap Fichiers Anymap PBM pnm

image/x-portable-bitmap Fichiers Bitmap PBM pbm

image/x-portable-graymap Fichiers Graymap PBM pgm

image/x-portable-pixmap Fichiers Pixmap PBM ppm

image/x-rgb Image RGB rgb

image/x-xbitmap Images Bitmap X xbm

image/x-xpixmap Images Pixmap X xpm

image/x-xwindowdump Images dump X Window man

multipart/x-zip Fichiers archive zip zip

multipart/x-gzip Fichiers archive GNU zip gz, gzip

text/html Fichiers HTML htm, html

text/plain Fichiers texte sans mise en forme txt, g, h, c, cc, hh, m, f90

text/richtext Fichiers texte enrichis rtx

text/tab-separated-value Fichiers texte avec séparation des valeurs tsv

text/x-setext Fichiers texte Struct etx

video/mpeg Vidéos MPEG mpeg, mpg, mpe

video/quicktime Vidéos QuickTime qt, mov

video/msvideo Vidéos Microsoft Windows avi

video/x-sgi-movie Vidéos MoviePlayer movie