tipi di nginx, x-accel-redirect e mime


9

Nella mia configurazione di nginx 0.8.34 sto usando la funzione X-Accel-Redirect per controllare i download di file nel codice dell'applicazione senza che l'applicazione gestisca il download stesso.

Dopo molto dolore, ora funziona praticamente, tranne che nginx restituisce sempre il file con il text/htmltipo di contenuto.

Il tipo di contenuto predefinito è application / octet-stream, specificato nel httpblocco.

Il blocco server contiene, tra le altre cose, la definizione della directory in cui sono memorizzati i file:

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

Quindi ho specificato il tipo di contenuto anche qui, ma nulla è cambiato.

Non voglio impostare il Content-Type dall'applicazione perché poi mi rallenterebbe (dovrei prima determinarlo). Quindi idealmente nginx restituirebbe il mimetype corretto in base all'estensione del file (includo mime.types nel httpblocco).

Risposte:


12

Se vuoi lasciare che nginx indovini il giusto tipo mime, devi assicurarti che nessun tipo di contenuto venga restituito dal tuo server back-end.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response

1
con tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') come metodo .clear imposta content-type su text / html
Anthony,

1

Personalmente ho appena impostato application / octet-stream nell'applicazione ma potresti essere in grado di usare fastcgi_ignore_headers per impedire a Nginx di usare l'intestazione fornita dal back-end.

fastcgi_ignore_headers Content-Type;

La ringrazio per la risposta. Voglio server diversi tipi di contenuto in modo che le immagini vengano visualizzate come immagini e file zip come opzioni di download. Quindi sfortunatamente questo non lo risolve del tutto.
Tomas Kohl,

L'hai provato o stai solo supponendo che non funzionerà? Ignorando l'intestazione fornita dal back-end, dovrebbe provare a determinarlo in base al file.
Martin Fjordvald,

2
Non si può ignorare Content-Type. Secondo wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers valori possibili sono X-Accel-Redirect, X-Accel-Expires, ExpiresoCache-Control
jnns

1
"È possibile specificare intestazioni come" mentre il fraseggio di merda non significa "i valori possibili sono". Ho ignorato Content-Type in precedenza in combinazione con x-accel-redirect, quindi non credo sia impossibile, però, ammetterò di non essere intimo con i dettagli grintosi.
Martin Fjordvald,

@MartinFjordvald, l'ho provato e nginx ha rifiutato di iniziare a lamentarsi nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27ma fastcgi_ignore_headers "Expires"funziona
dnozay

0

con php-fpm:

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

dice a php di non inviare affatto un'intestazione Content-Type (nemmeno una vuota), e nginx indovina il tipo per te e aggiunge l'intestazione :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.