Apache : pourquoi éviter .htaccess

J’ai participé aujourd’hui à une discussion sur le forum Ubuntu-fr, où une personne indiquait que ses fichiers .htaccess étaient inopérants.

J’ai toujours déconseillé d’utiliser les fichiers .htaccess, sauf quand c’est obligatoire. Et quand est-ce obligatoire ? Quand on n’a pas accès à la configuration du serveur Apache (par exemple sur un hébergement mutualisé).

Je reprends ici l’explication que j’ai donnée dans la discussion sus-citée, qui permet de mieux comprendre pourquoi il faut favoriser la configuration d’Apache plutôt que les fichiers .htaccess.

L’argument en faveur de la non-utilisation des fichiers .htaccess est la performance. La différence à ce niveau peut se ressentir lorsqu’il y a de très grosses charges. En utilisation « habituelle » il n’y a pas trop de différence.

Le fonctionnement de la chose

En fait, si AllowOverride n’est pas à None, Apache va chercher un fichier .htaccess dans le répertoire du fichier demandé, puis dans le répertoire parent, puis dans le répertoire parent du parent, ainsi de suite jusqu’à la racine, tant qu’il n’en trouve pas. Cela, à chaque requête. Et lorsqu’il trouve le fichier, il le lit, l’analyse, vérifie sa validité et applique dynamiquement son contenu. Il doit refaire cela à chaque requête car le contenu de ce fichier .htaccess peut changer à n’importe quel moment.

… alors que des instructions dans les fichiers de configuration d’Apache, c’est chargé au lancement d’Apache, vérifié, appliqué et ça ne bouge plus.

Surcharge du serveur

Par conséquent, s’il y a un fichier .htaccess dans le répertoire, chaque requête sera accompagnée de la lecture de ce fichier et de son analyse, systématiquement. Je ne saurais pas dire quelle est la réelle consommation processeur de ces étapes, mais on imagine facilement qu’entre la dérouler une seule fois au démarrage d’Apache ou la dérouler à chaque requête, la charge processeur est bien différente.

À l’opposé, s’il n’y a pas de fichier « .htaccess » lors du téléchargement d’un fichier qui serait, par exemple, /srv/www/mon_super_site/fichiers/images/logos/ma_boite/mon_super_logo.png, alors Apache va échouer à ouvrir :

  • /srv/www/mon_super_site/fichiers/images/logos/ma_boite/.htaccess ;
  • puis /srv/www/mon_super_site/fichiers/images/logos/.htaccess ;
  • puis /srv/www/mon_super_site/fichiers/images/.htaccess ;
  • puis /srv/www/mon_super_site/fichiers/.htaccess ;
  • puis /srv/www/mon_super_site/.htaccess ;
  • puis /srv/www/.htaccess ;
  • puis /srv/.htaccess ;
  • puis /.htaccess.

Apache ferait donc 8 requêtes sur le disque dur pour trouver des fichiers qui n’existent pas, en complément de la lecture du fichier à desservir.

Sur un serveur peu chargé, ça ne se ressent pas des masses. Par contre, sur un serveur qui a une charge de 1000 requêtes par seconde, 1000 ou 9000 lectures par seconde c’est une sacrée différence.

Avec AllowOverride None, Apache ne cherche tout simplement pas le fichier .htaccess

Sur le même sujet

comments powered by Disqus