Personnaliser le listage des dossiers dans Apache

↩ Retour ∙ Posté le web unix-linux

Apache httpd est un super serveur Web qui propose un tas de modules pour faire ce dont on a besoin. En général sur les distributions Linux populaires il est préconfiguré pour afficher la liste des fichiers présents si on accède à un répertoire qui ne contient pas de fichier index.html ou index.php. Nous allons voir ici comment personnaliser cet affichage pour le rendre plus pratique et plus beau.

Je pars d’une distribution Debian, la configuration par défaut est différente sur d’autres systèmes comme par exemple FreeBSD.

Point écriture : je traduis listing par listage parce que j’aime pas trop les anglicismes en -ing comme shopping, parking, cocooning, souping, showering

Le listage par défaut de mon dépot de fichiers public.

Processus d’affichage de l’index

Lorsqu’on demande l’accès à un chemin, le serveur va d’abord essayer de trouver un fichier d’index. S’il n’en trouve pas, il va déclencher le listage du dossier. Cet aiguillage se fait via le module mod_dir activé par défaut.

Dans le fichier /etc/apache2/mods-enabled/dir.conf on peut voir le contenu suivant :

<IfModule mod_dir.c>
        DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>

C’est ici que sont définis les différents noms de fichiers pouvant être considérés comme index. Si un dossier contient plusieurs fichiers candidats comme par exemple index.html et index.php alors ce sera le premier de la liste qui sera affiché.

Ainsi si aucun fichier d’index n’est présent alors la génération de la page de listage va se faire par le module mod_autoindex mais à la condition que l’option Indexes soit activée pour le dossier.

Dans le fichier /etc/apache2/apache2.conf on trouve entre autres :

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Ici l’option est activée pour le répertoire par défaut /var/www/ et ses sous-dossiers.

Le module de listage

Les inconvénients de la configuration par défaut

Tout se passe dans le fichier /etc/apache2/mods-enabled/autoindex.conf qui contient par défaut un certain nombre de choses qui améliore déjà l’aspect de la page, comme l’option FancyIndexing et HTMLTable qui créent un affichage enrichi et mis en forme dans un tableau HTML avec des colonnes de tri.

Sans ces options, mon dossier ressemble à cela :

Je suis satisfait de l’affichage fancy mais je voudrais faire certains changements :

  • retirer la colonne de description qui ne sert à rien ;
  • retirer la ligne du bas qui contient la version du serveur et le domaine ;
  • ajouter un entête avec un titre ;
  • ajouter un lien pour revenir au domaine principal ;
  • rendre compatible l’affichage avec les mobiles ;
  • harmoniser un peu le style avec le reste du site.

Retrait des colonnes superflues

Le retrait de la colonne de description se fait très simplement en rajoutant l’option SuppressDescription à la directive IndexOptions située en début de fichier.

Pour gagner de la place et parce que les dates de fichiers sont rarement les bonnes, j’ai décidé de supprimer aussi la colonne Last modified avec SuppressLastModified.

L’entête et le pied de page

En ce qui concerne ces éléments, le module est réglé pour aller chercher des fichiers HEADER.html et README.html différents pour chaque dossier affiché. Moi je veux des fichiers uniques pour tout le domaine donc je configure les deux directives suivantes comme ceci :

ReadmeName /.footer.html
HeaderName /.header.html

Le / permet que le même fichier doit être réutilisé partout dans l’arborescence. J’ai fait des fichiers cachés (ils commencent par un point) pour éviter leur apparition dans la liste.

Pour le moment mon entête contient seulement un bloc <h1> et mon pied de page un <a>.

Affichage mobile, favicon et titre d’onglet

Pour l’affichage mobile il faut rajouter une ligne dans le <head> et je vais en profiter pour ajouter un titre d’onglet et mettre un favicon.

Par défaut le serveur rajoute l’entête HTML suivant :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /</title>
 </head>
 <body>

Pour désactiver cet entête automatique il faut rajouter l’option SuppressHTMLPreamble à IndexOptions. Ensuite on est libre de mettre le notre. À noter que du coup il faut rajouter les balises fermantes dans l’autre fichier, même si leur absence ne pose jamais problème dans la réalité.

Mon fichier .header.html ressemble maintenant à ça :

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/png" href="https://hyakosm.net/assets/favicon.png">
  <title>data.hyakosm.net</title>
 </head>
 <body>

L’encodage est par défaut en UTF-8 donc je ne fais que l’expliciter. C’est la propriété de viewport qui permet de corriger l’affichage.

Il existe une directive IndexStyleSheet pour spécifier une feuille de style CSS mais elle ne fonctionne pas avec SuppressHTMLPreamble, la solution est de spécifier un fichier CSS dans l’entête ou d’incorporer un bloc <style>.

Voilà le résultat final pour le moment. On ne peut pas tout personnaliser, par exemple pas possible de changer la langue des labels. En fouillant un peu on s’aperçoit que les labels sont codés en dur dans le fichier source mod_autoindex.c, par exemple pour les titres de colonnes à partir de la ligne 1584, le fichier total faisant 2348 lignes.

Le principal intérêt c’est d’utiliser un module par défaut qui génère des pages HTML, ce qui m’évite de devoir passer par des navigateurs de fichiers en PHP plus lourds et peut-être moins sécurisés.