Frage Wie kann ich sicherstellen, dass Nginx Klartextdateien als Download und nicht als Inline-Datei bereitstellt?


Ich habe eine Rails-Anwendung (Redmine), die mit Nginx funktioniert. Wenn ich auf irgendeinen Anhang klicke, frage mich mein Browser (Firefox, zB Chrome), die Datei herunterzuladen. Aber wenn ich einen txt-artigen Anhang anklicke, öffnet mein Browser diese Datei im Browser.

Wie ich es verstehe, ist es Aufgabe von Nginx zu entscheiden - Datei im Browser öffnen oder herunterladen. Wie kann ich es einrichten?


18
2018-02-28 07:29


Ursprung




Antworten:


Der Standardtyp für die TXT-Erweiterung ist text / plain. Dieses Verhalten wird in mime.types-Datei beschrieben. Benutzen 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
2018-02-28 08:45





Wechseln Content-Type von .txt Dateien können zwar funktionieren, aber es ist eine etwas riskante Art, dieses Problem zu lösen, weil Sie nicht 100% ig garantieren können, dass der Browser des Benutzers so reagiert, wie Sie es erwarten. Und außerdem ist es irreführend, a zu beschriften .txt Datei als Binärdatei.

Stattdessen schlage ich vor, die Standardmethode zu verwenden, um einen Browser zum Herunterladen zu zwingen, anstatt die Datei anzuzeigen, die den Browser verwenden soll Content-Disposition Header mit einem Wert von attachment (RFC 2183, siehe auch RFC 2616).

Zum Beispiel dieses nginx location Block sendet einen solchen Header mit .txt Dateien unter dem /downloads/ URI und so werden sie gezwungen sein, herunterzuladen:

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

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


18
2018-02-28 12:05



Es scheint die beste Lösung zu sein. - Vadim
Aber Content-Disposition hack in chrom browser kann anfangen, schlechte worte in die konsole zu sagen und sogar aufhören, irgendwelche dateien von der seite herunterzuladen. Es sagt thinhgs (mit gelben Dreiecken) wie: "Resource interpreted as Document but transferred with MIME type image/png:" - Nakilon


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

Wir haben folgenden Standort in unserem Service für herunterladbares Werbematerial (welches PDFs, Bilder und einige Dokumente enthält, aber ich bin sicher, dass es auch mit txt-Dateien funktionieren wird):

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

Jeder von uns getestete Browser lädt alle Dateien von diesem Ort herunter, anstatt sie anzuzeigen.


4
2018-02-28 08:57



Mit "add_header" ist es absolut falsch, stattdessen "default_type" verwenden: location / smth / {default_type application / octet-stream ;; } - Oleg Neumyvakin
@OlegNeumyvakin Warum ist default_type besser als add_header? - user193661
@ user193661 Da "add_header" einen neuen Header "Content-Type" enthält, können zwei "Content-Type" -Kopfzeilen gefunden werden, was zu merkwürdigem Verhalten von HTTP-Clients führen kann. "default_type" wird als Antwort auf den Header "Content-Type" gesetzt (überschrieben). - Oleg Neumyvakin