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.
- mod_rewrite n’exécute pas de redirections spécifiques sur XAMPP – conflit avec DirectoryIndex?
- Autoriser Facebook à accéder à mon site pour qu’il puisse lire les balises méta OpenGraph
- Apache Redirection vers Index.php avec https
- .htaccess – redirect le lien d’ancrage
- Réécriture et redirection d’URL (avec données de firebase database)
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:
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 ^ _ ^