mod_xsendfile : forcer le téléchargement de fichiers avec apache et php

mod_xsendfile : forcer le téléchargement de fichiers avec apache et php

Posté le 18 janvier 2011 | Catégorie Astuces, Ressources

Forcer le téléchargement d'un fichier est relativement simple en PHP. Il suffit de l'ouvrir, le lire, l'assigner à une variable, prévoir les headers correspondants et enfin envoyer le contenu du fameux fichier. Très pratique pour gérer l'accès de fichiers soumis à autorisation.

Oui... Mais ! D'une part, ce processus est très lent : combien de temps pour que PHP ouvre et renvoie un fichier d'une centaine de Mo ? Beaucoup trop. D'autre part la limite de mémoire allouée à PHP sera très vite atteinte, ou le temps d'execution maximal le se sera avant...

Une alternative est proposée par mod_xsendfile, un module Apache2 (mais des versions compatibles Nginx et lighttpd existent). Le module surveille la présence d'en-têtes X-SENDFILE dans les requêtes http et réagit en envoyant directement le fichier demandé au navigateur sans traitement préalable par PHP ou n'importe quel autre langage (perl, cgi...).

Installation de mod_xsendfile sur Linux

  1. Télécharger les sources sur le site officiel
  2. Compiler et installer le programme (si apxs ou apxs2 est installé) :
    apxs2 -cia mod_xsendfile.c
  3. Redemarrer le serveur apache

Installation de mod_xsendfile sur Windows

  1. Télécharger l'archive sur le site officiel
  2. Choisir la version compatible avec votre installation apache (2.0 ou 2.2) et placer le fichier mod_xsendfile.so dans le dossier "modules" du serveur apache
  3. Ajouter la ligne suivante dans le fichier de conf d'apache pour activer le module
    LoadModule xsendfile_module modules/mod_xsendfile.so
  4. Redemarrer le serveur apache

Configuration

Toute la configuration se fait dans les directives apache de votre document root (ou le .htaccess selon le cas).

# Activer le module XSendFile
XSendFile On

# Optionnel - Autoriser l'envoi de fichier se trouvant dans des répertoires parents
XSendFileAllowAbove On

# Optionnel - Définir une liste de répertoires autorisés
XSendFilePath /var/www/clients/fichiers

Exemple d'utilisation avec PHP

header("X-Sendfile: /var/www/clients/fichiers/fichier-protege.txt");
header("Content-Disposition: attachment; file=fichier-client.txt");

Au final

En vérifiant au préalable l'identité d'un utilisateur, mod_xsendfile permet de réaliser un controle d'accès très efficace, ne necessitant que très peu de ressources. En permettant à apache de réaliser ce qu'il fait de mieux, à savoir envoyer des fichiers, ce module est un must-have coté sécurité et performances.


Pour aller plus loin :

mod_xsendfile : forcer le téléchargement de fichiers avec apache et php