it-swarm.com.de

Wie kann ich sicherstellen, dass Nginx Klartextdateien als Download anstelle von Inline-Dateien bereitstellt?

Ich habe Rails Anwendung (Redmine), die mit Nginx funktioniert. Wenn ich auf einen Anhang klicke, bitte mich mein Browser (Firefox, dh Chrome), die Datei herunterzuladen. Wenn ich aber auf txt klicke -Typ Anhang Mein Browser öffnet diese Datei im Browser.

Soweit ich weiß, ist es Aufgabe von Nginx, zu entscheiden, ob eine Datei im Browser geöffnet oder heruntergeladen werden soll. Wie kann ich es einrichten?

18
demas

Der Standardtyp für die txt-Erweiterung ist text/plain. Dieses Verhalten wird in der Datei mime.types beschrieben. Verwenden Sie http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type oder http://nginx.org/en/docs/http/ngx_http_core_module.html# types , um es zu überschreiben (möglicherweise auf application/octet-stream gesetzt).

10
Vadim

Wechseln Content-Type von .txt Dateien funktionieren möglicherweise, aber es ist ein etwas riskanter Weg, um dieses Problem zu lösen, da Sie nicht 100% garantieren können, dass der Browser des Benutzers so reagiert, wie Sie es erwarten. Außerdem ist es irreführend, ein .txt Datei als Binärdatei.

Stattdessen schlage ich vor, die Standardmethode zu verwenden, um einen Browser zum Herunterladen zu zwingen, anstatt die Datei anzuzeigen. Verwenden Sie dazu das Content-Disposition Header mit dem Wert attachment ( RFC 218 , siehe auch RFC 2616 ).

Zum Beispiel sendet dieser nginx location Block einen solchen Header mit .txt Dateien unter dem /downloads/ URI und daher müssen sie Folgendes herunterladen:

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

Sie können also andere geeignete Übereinstimmungen usw. hinzufügen, die Ihrer Konfiguration entsprechen.

20
daveadams

Sie müssen den Speicherort für die herunterladbare Datei extrahieren und ihren Inhaltstyp auf application/octet-stream Festlegen.

Wir haben folgenden Speicherort für herunterladbares Werbematerial (das PDFs, Bilder und einige Dokumente enthält, aber ich bin sicher, dass es auch mit TXT-Dateien funktioniert):

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

Jeder Browser, den wir versucht haben, lädt alle Dateien von diesem Speicherort herunter, anstatt zu versuchen, sie anzuzeigen.

4
rvs