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
- Télécharger les sources sur le site officiel
- Compiler et installer le programme (si apxs ou apxs2 est installé) :
apxs2 -cia mod_xsendfile.c - Redemarrer le serveur apache
Installation de mod_xsendfile sur Windows
- Télécharger l'archive sur le site officiel
- 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
- Ajouter la ligne suivante dans le fichier de conf d'apache pour activer le module
LoadModule xsendfile_module modules/mod_xsendfile.so - 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 :
