¿Cómo puedo asegurarme de que Nginx sirve archivos de texto sin formato como descarga, en lugar de en línea?


18

Tengo la aplicación Rails (Redmine) que funciona con Nginx. Si hago clic en algún archivo adjunto, mi navegador (Firefox, es decir, Chrome) me pide que descargue el archivo. Pero si hago clic en un archivo adjunto de tipo txt, mi navegador abre este archivo en el navegador.

Según tengo entendido, es tarea de Nginx decidir: abrir el archivo en el navegador o descargarlo. ¿Cómo puedo configurarlo?

Respuestas:



20

Cambio de la Content-Typede .txtarchivos puede trabajar, pero es una manera un tanto arriesgado para resolver este problema, porque no se puede garantizar al 100% que el navegador del usuario responderá cómo espera. Y además, es engañoso etiquetar un .txtarchivo como un archivo binario.

En cambio, sugiero usar la forma estándar para forzar a un navegador a descargar en lugar de mostrar el archivo, que es usar el Content-Dispositionencabezado con un valor de attachment( RFC 2183 , ver también RFC 2616 ).

Por ejemplo, este locationbloque nginx enviará un encabezado con .txtarchivos bajo el /downloads/URI y, por lo tanto, se verán obligados a descargar:

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

Por lo tanto, puede agregar otras coincidencias apropiadas, etc., apropiadas para su configuración.


3
Parece ser la mejor solución.
Vadim

Pero Content-Dispositionpiratear el navegador de cromo puede comenzar a decir malas palabras en la consola e incluso dejar de descargar cualquier archivo de la página. Dice thinhgs (con triángulos amarillos) como:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

Debe extraer la ubicación del archivo descargable y establecer su tipo de contenido como application/octet-stream.

Tenemos la siguiente ubicación en nuestro servicio para material promocional descargable (que incluye archivos PDF, imágenes y algunos documentos, pero estoy seguro de que también funcionará con archivos txt):

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

Todos los navegadores que hemos probado descargan todos los archivos de esta ubicación en lugar de intentar mostrarlos.


44
Usar "add_header" es absolutamente incorrecto, use "default_type" en su lugar: location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin ¿Por qué es default_type mejor que add_header?
user193661

2
@ user193661 Debido a que "add_header" literalmente agrega un nuevo encabezado "Content-Type", por lo que en respuesta puede obtener dos encabezados "Content-Type" que pueden conducir a un comportamiento extraño de los clientes HTTP. "default_type" se establece (sobrescribe) un solo encabezado "Content-Type" en respuesta.
Oleg Neumyvakin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.