En-tête append Content-Disposition “attachment” provoque une erreur du serveur interne

Comme le navigateur intégré de mon ebook-reader (Sony PRS-T1) est assez stupide et veut ouvrir des fichiers .epub en tant que fichiers texte au lieu de les télécharger, j’ai essayé de forcer le navigateur à télécharger les fichiers .epub avec ce .htaccess fichier:

 ForceType application/octet-stream Header add Content-Disposition "attachment"  

Cependant, cela provoque une erreur de serveur interne:

Erreur Interne du Serveur

Le serveur a rencontré une erreur interne ou une configuration incorrecte et n’a pas pu terminer votre demande.

Veuillez contacter l’administrateur du serveur, webmaster @ localhost et l’informer de l’heure à laquelle l’erreur est survenue et de tout ce qui a pu être à l’origine de l’erreur.

Plus d’informations sur cette erreur peuvent être disponibles dans le journal des erreurs du serveur.

Lorsque je laisse de côté l’en- Header add Content-Disposition "attachment" il n’y a pas d’erreur – cependant, le navigateur ne télécharge pas le fichier 🙁

Est-ce que je fais quelque chose de mal? D’où vient l’erreur du serveur interne?

[EDIT 2013-04-11]

Je viens de gagner le “badge-question populaire” pour ce sujet, ce qui m’a rappelé l’ajout d’informations.

J’ai finalement réussi à forcer le téléchargement sur le navigateur PRS-T1 de Sony avec la fonction php suivante

 function startDownload($path, $mimeType) { if(!file_exists($path)) { // File doesn't exist, output error exit('file not found'); } else { $size = filesize($path); $file = basename($path); // Set headers header("Pragma: public"); // required header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private",false); // required for certain browsers header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=\"$file\""); header("Content-Type: $mimeType"); header("Content-Transfer-Encoding: binary"); header("Content-Length: $size"); // Read the file from disk readfile($path); } exit(); } 

J’espère que ça aide quelqu’un un jour.

Cela pourrait être la réponse:

http://diogomelo.net/node/24

Les en-têtes de module ne sont pas activés par défaut sur Apache. Nous devons donc l’activer manuellement.

Pour activer ce module, connectez-vous en tant que root et créez un lien symbolique entre mods-available / headers.load et mods-enabled. Après cela, rechargez apache et c’est fait. Pour ce faire, j’ai utilisé ces commandes.

 su - cd /etc/apache2/mods-enabled/ ln -s ../mods-available/headers.load headers.load sh /etc/init.d/apache2 force-reload 

Vous pouvez également vous assurer que le module d’en-têtes est activé avant de l’utiliser dans votre fichier htaccess. La ligne suivante générera une erreur si le module d’en-têtes n’est pas activé:

 Header set Content-Disposition "attachment" 

voici un exemple qui force le téléchargement de fichiers mp3 uniquement si le module d’en-têtes est activé:

   ForceType audio/mpeg Header set Content-Disposition "attachment" Allow from all   

Remarque: il n’active pas le module, il ignore simplement tout ce qui se trouve dans les balises IfModule si le module n’est pas activé.

Pour activer les modules apache, vous devez soit éditer votre fichier httpd.conf, soit dans le serveur wamp, vous pouvez cliquer sur l’icône du plateau de wamp et sélectionner “Apache -> Modules Apache -> headers_module” ou vérifier qu’il est coché.

Pour Ubuntu, theres est un raccourci pour activer le module des en-têtes apache2, en utilisant:

 sudo a2enmod headers 

Problème résolu ^ _ ^