Comment puis-je m'assurer que Nginx sert des fichiers en texte brut en téléchargement, plutôt qu'en ligne?


18

J'ai une application Rails (Redmine) qui fonctionne avec Nginx. Si je clique sur une pièce jointe, mon navigateur (Firefox, c'est-à-dire Chrome) me demande de télécharger le fichier. Mais si je clique sur une pièce jointe de type txt, mon navigateur ouvre ce fichier dans le navigateur.

Si je comprends bien, c'est la tâche de Nginx de décider - ouvrir le fichier dans le navigateur ou le télécharger. Comment puis-je le configurer?

Réponses:



20

La modification Content-Typedes .txtfichiers peut fonctionner, mais c'est un moyen quelque peu risqué de résoudre ce problème, car vous ne pouvez pas garantir à 100% que le navigateur de l'utilisateur répondra comme vous l'attendez. Et en outre, il est trompeur d'étiqueter un .txtfichier en tant que fichier binaire.

Au lieu de cela, je suggère d'utiliser la méthode standard pour forcer un navigateur à télécharger plutôt que d'afficher le fichier, qui consiste à utiliser l'en- Content-Dispositiontête avec une valeur de attachment( RFC 2183 , voir également RFC 2616 ).

Par exemple, ce locationbloc nginx enverra un tel en-tête avec des .txtfichiers sous l' /downloads/URI et donc ils seront forcés de télécharger:

location ~ ^/downloads/.*\.txt$ {
  add_header Content-Disposition "attachment";
}

Vous pouvez donc ajouter d'autres correspondances appropriées, etc., adaptées à votre configuration.


3
Cela semble être la meilleure solution.
Vadim

Mais le Content-Dispositionpiratage du navigateur Chrome peut commencer à dire de mauvais mots dans la console et même arrêter de télécharger des fichiers depuis la page. Il dit minces (avec des triangles jaunes) comme:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

Vous devez extraire l'emplacement du fichier téléchargeable et définir leur type de contenu comme application/octet-stream.

Nous avons l'emplacement suivant sur notre service pour le matériel promotionnel téléchargeable (qui comprend les fichiers PDF, les images et certains documents, mais je suis sûr que cela fonctionnera également avec les fichiers txt):

location /promomaterial/download/ {
         add_header Content-Type application/octet-stream;
}

Chaque navigateur que nous avons essayé télécharge tous les fichiers de cet emplacement au lieu d'essayer de les afficher.


4
En utilisant "add_header" c'est absolument faux, utilisez plutôt "default_type": location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin Pourquoi est-ce que default_type est meilleur que add_header?
user193661

2
@ user193661 Parce que "add_header" ajoute littéralement un nouvel en-tête "Content-Type", donc en réponse, vous pouvez obtenir deux en-têtes "Content-Type" ce qui peut conduire à un comportement étrange des clients HTTP. "default_type" est défini (écraser) un seul en-tête "Content-Type" en réponse.
Oleg Neumyvakin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.