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


18

Ich habe eine Rails-Anwendung (Redmine), die mit Nginx funktioniert. Wenn ich auf einen Anhang klicke, fordere mein Browser (Firefox, also Chrome) mich auf, die Datei herunterzuladen. Wenn ich jedoch auf einen Anhang vom Typ txt klicke, öffnet mein Browser diese Datei im Browser.

Soweit ich weiß, ist es Aufgabe von Nginx, Dateien im Browser zu öffnen oder herunterzuladen. Wie kann ich es einrichten?

Antworten:



20

Ändern der Content-Typevon.txt Dateien arbeiten kann, aber es ist eine etwas riskante Art und Weise , dieses Problem zu lösen, weil Sie nicht zu 100% garantieren können , dass der Browser des Benutzers reagieren , wie Sie es erwarten. Außerdem ist es irreführend, eine .txtDatei als Binärdatei zu bezeichnen.

Stattdessen schlage ich vor, die Standardmethode zu verwenden, um einen Browser zum Herunterladen zu zwingen, anstatt die Datei anzuzeigen. Hierzu wird der Content-DispositionHeader mit dem Wert attachment( RFC 2183 , siehe auch RFC 2616) verwendet ) verwendet.

Dieser Nginx- locationBlock sendet beispielsweise einen solchen Header mit .txtDateien unter der /downloads/URI herunter, und daher werden sie zum Herunterladen gezwungen:

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

So können Sie Ihrer Konfiguration andere geeignete Übereinstimmungen usw. hinzufügen.


3
Es scheint die beste Lösung zu sein.
Vadim

Aber Content-DispositionHack in Chrom-Browser kann beginnen, schlechte Worte in die Konsole zu sagen und sogar das Herunterladen von Dateien von der Seite zu stoppen. Es heißt Thinhgs (mit gelben Dreiecken) wie:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

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

Wir haben folgenden Ort in unserem Service für herunterladbares Werbematerial (das 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 Browser, den wir ausprobiert haben, lädt alle Dateien von diesem Speicherort herunter, anstatt zu versuchen, sie anzuzeigen.


4
Wenn Sie "add_header" verwenden, ist dies absolut falsch. Verwenden Sie stattdessen "default_type": location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin Warum ist default_type besser als add_header?
user193661

2
@ user193661 Da "add_header" einen neuen Header "Content-Type" hinzufügt, können Sie als Antwort zwei "Content-Type" -Header abrufen, was zu merkwürdigem Verhalten von HTTP-Clients führen kann. "default_type" wird als Antwort auf einen einzelnen "Content-Type" -Header gesetzt (überschrieben).
Oleg Neumyvakin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.