Nginx-, X-Accel-Redirect- und MIME-Typen

9

In meinem Nginx 0.8.34-Setup verwende ich die X-Accel-Redirect-Funktion, um das Herunterladen von Dateien im Anwendungscode zu steuern, ohne dass die Anwendung den Download selbst übernimmt.

Nach viel Mühe funktioniert dies jetzt im Grunde, außer dass nginx die Datei immer mit dem text/htmlInhaltstyp zurückgibt .

Der Standardinhaltstyp ist application / octet-stream, der im httpBlock angegeben ist.

Der Serverblock enthält unter anderem die Definition des Verzeichnisses, in dem die Dateien gespeichert sind:

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

Also habe ich den Inhaltstyp auch hier angegeben, aber nichts hat sich geändert.

Ich möchte den Inhaltstyp nicht von der Anwendung festlegen, da ich mich dann verlangsamen würde (ich müsste ihn zuerst bestimmen). Idealerweise würde nginx den richtigen Mimetyp basierend auf der Dateierweiterung zurückgeben (ich füge mime.types in den httpBlock ein).

Tomas Kohl
quelle

Antworten:

12

Wenn Sie nginx den richtigen MIME-Typ erraten lassen möchten, müssen Sie sicherstellen, dass kein Inhaltstyp von Ihrem Backend-Server zurückgegeben wird.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response
Sebastien Estienne
quelle
1
mit tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type'), da die .clear-Methode den Inhaltstyp auf text / html setzt
Anthony
1

Ich persönlich nur application / octet-Stream in der Anwendung festgelegt , aber sie könnten der Lage sein zu verwenden fastcgi_ignore_headers Nginx von der Nutzung des Back-End geliefert Header zu verhindern.

fastcgi_ignore_headers Content-Type;
Martin Fjordvald
quelle
Vielen Dank für Ihre Antwort. Ich möchte verschiedene Inhaltstypen bedienen, damit Bilder als Bilder gerendert werden und Zip-Dateien als Download-Option angeboten werden. Das löst es also leider nicht ganz.
Tomas Kohl
Hast du es versucht oder nimmst du nur an, dass es nicht funktioniert? Durch Ignorieren des im Back-End bereitgestellten Headers sollte versucht werden, ihn anhand der Datei zu ermitteln.
Martin Fjordvald
2
Man kann nicht ignorieren Content-Type. Nach wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers möglichen Werte sind X-Accel-Redirect, X-Accel-Expires, ExpiresoderCache-Control
jnns
1
"Es ist möglich, Überschriften wie" anzugeben, während beschissene Phrasierung nicht "die möglichen Werte sind" bedeutet. Ich habe Content-Type zuvor in Kombination mit x-accel-redirect ignoriert, daher denke ich nicht, dass dies unmöglich ist. Ich gebe jedoch zu, dass ich mit den Details nicht vertraut bin.
Martin Fjordvald
@ MartinFjordvald, versuchte es und Nginx weigerte sich zu beschweren, nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27aber fastcgi_ignore_headers "Expires"funktioniert
dnozay
0

mit php-fpm:

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

weist php an, überhaupt keinen Content-Type-Header zu senden (nicht einmal einen leeren), und nginx wird den Typ für Sie erraten und den Header hinzufügen :)

hanshenrik
quelle