nginx, x-accel-redirect y tipos mime

9

En mi configuración nginx 0.8.34, estoy usando la función X-Accel-Redirect para controlar las descargas de archivos en el código de la aplicación sin que la aplicación maneje la descarga en sí.

Después de mucho dolor, esto ahora funciona básicamente, excepto que nginx siempre devuelve el archivo con el text/htmltipo de contenido.

El tipo de contenido predeterminado es application / octet-stream, especificado en el httpbloque.

El bloque de servidor contiene, entre otras cosas, la definición del directorio donde se almacenan los archivos:

location /files {
  default_type  application/octet-stream;
  alias /srv/www/uploads;
  internal;  
}

Así que especifiqué el tipo de contenido incluso aquí, pero nada ha cambiado.

No quiero establecer el tipo de contenido por la aplicación porque luego me ralentizaría (primero tendría que determinarlo). Entonces, idealmente, nginx devolvería el tipo mime correcto basado en la extensión del archivo (sí incluyo mime.types en el httpbloque).

Tomás Kohl
fuente

Respuestas:

12

Si desea dejar que nginx adivine el tipo mime correcto, debe asegurarse de que no se devuelva ningún tipo de contenido desde su servidor back-end.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response
Sebastien Estienne
fuente
1
con tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') como el método .clear establece content-type en text / html
Anthony
1

Personalmente, solo configuré application / octet-stream en la aplicación, pero es posible que pueda usar fastcgi_ignore_headers para evitar que Nginx use el encabezado suministrado por el back-end.

fastcgi_ignore_headers Content-Type;
Martin Fjordvald
fuente
Gracias por su respuesta. Quiero servir diferentes tipos de contenido para que las imágenes se muestren como imágenes y los archivos zip se ofrecen como una opción de descarga. Así que desafortunadamente esto no lo resuelve del todo.
Tomas Kohl
¿Lo probaste o simplemente estás asumiendo que no funcionará? Al ignorar el encabezado suministrado por el servidor, debe intentar determinarlo en función del archivo.
Martin Fjordvald
2
No se puede ignorar Content-Type. Según wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers valores posibles son X-Accel-Redirect, X-Accel-Expires, ExpiresoCache-Control
jnns
1
"Es posible especificar encabezados como" mientras que el fraseo de mierda no significa "los valores posibles son". He ignorado Content-Type antes en combinación con x-accel-redirect, así que no creo que sea imposible, sin embargo, admito que no soy íntimo con los detalles arenosos.
Martin Fjordvald
@MartinFjordvald, lo intentó y nginx se negó a comenzar a quejarse, nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27pero fastcgi_ignore_headers "Expires"funciona
dnozay
0

con php-fpm:

<?php
    header("Content-Type: ");
    header("X-accel-redirect: (...)");

le dice a php que no envíe un encabezado Content-Type (ni siquiera uno vacío), y nginx adivinará el tipo por usted y agregará el encabezado :)

Hanshenrik
fuente