2016-05-03 7 views
0

Ich arbeite an einer Konfiguration von uwsgi + nginx für unsere Python Web App. ich die X-Sendfile Emulation (siehe http://uwsgi-docs.readthedocs.io/en/latest/Snippets.html) hinzufügen möchten:uwsgi X-Sendfile-Emulation MIME-Typ fehlt?

[uwsgi] 
collect-header = X-Sendfile X_SENDFILE 
response-route-if-not = empty:${X_SENDFILE} static:${X_SENDFILE} 

Jetzt besuchen i unserer Website, wird der Inhalt responsed richtig sendfile() verwenden. Der einzige Fehler ist Content-Type fehlt, sogar ich habe es explizit in wsgi Antwort gesetzt. Ich habe viele Methoden experimentiert, die einzige Problemumgehung, die ich gefunden habe, ist:

[uwsgi] 

collect-header = X-Sendfile-Content-Type X_SENDFILE_CONTENT_TYPE 
collect-header = X-Sendfile X_SENDFILE 
response-route-if-not= empty:${X_SENDFILE_CONTENT_TYPE} addheader:Content-Type: ${X_SENDFILE_CONTENT_TYPE} 
response-route-if-not = empty:${X_SENDFILE} static:${X_SENDFILE} 

Dies funktioniert aber ein bisschen albern. Ich würde wirklich wollen, dass der Inhaltstyp durch die Dateierweiterung bestimmt werden kann. Ist es möglich?

Antwort

0

Nach dem Graben in den Quellcode des uwsgi, ich den Grund gefunden habe (siehe https://github.com/unbit/uwsgi/blob/2.0.12/core/uwsgi.c#L2677)

if (uwsgi.build_mime_dict) { 
     if (!uwsgi.mime_file) 
#ifdef __APPLE__ 
      uwsgi_string_new_list(&uwsgi.mime_file, "/etc/apache2/mime.types"); 
#else 
      uwsgi_string_new_list(&uwsgi.mime_file, "/etc/mime.types"); 
#endif 
     struct uwsgi_string_list *umd = uwsgi.mime_file; 
     while (umd) { 
      if (!access(umd->value, R_OK)) { 
       uwsgi_build_mime_dict(umd->value); 
      } 
      else { 
       uwsgi_log("!!! no %s file found !!!\n", umd->value); 
      } 
      umd = umd->next; 
     } 
    } 

uwsgi den Mime dict (Mapping Dateierweiterung Inhaltstyp) bauen nur, wenn die Variable build_mime_dict gesetzt . Und da meine Konfiguration keine Optionen enthält, die dieses Varail einstellen, ist das MIME-Dict leer.

Wenn Sie also eine statische Option (wie zum Beispiel mimefile) hinzufügen, wird das MIME-Diktat erstellt. Ändern Sie auch Collect-Header zu Pull-Header, um sicherzustellen, dass der tatsächliche Dateipfad nicht angezeigt wird.

[uwsgi] 
mimefile = /etc/mime.types 
pull-header = X-Sendfile X_SENDFILE 
response-route-if-not = empty:${X_SENDFILE} static:${X_SENDFILE}