Nginxがインラインではなくプレーンテキストファイルをダウンロードとして提供することを確認するにはどうすればよいですか?


18

Nginxで動作するRailsアプリケーション(Redmine)があります。ブラウザ(firefox、つまりchrome)の添付ファイルをクリックすると、ファイルのダウンロードを求められます。ただし、txtタイプの添付ファイルをクリックすると、ブラウザでこのファイルが開きます。

私が理解しているように、ブラウザでファイルを開くかダウンロードするかを決定するのはNginxのタスクです。どうすれば設定できますか?

回答:



20

ファイルの変更Content-Type.txt機能する可能性がありますが、ユーザーのブラウザーが期待どおりに応答することを100%保証することはできないため、この問題を解決するには多少危険な方法です。さらに、.txtファイルをバイナリファイルとしてラベル付けすることは誤解を招きます。

代わりに、ファイルを表示するのではなく、ブラウザに強制的にダウンロードさせる標準的な方法を使用することをお勧めします。これは、Content-DispositionヘッダーattachmentRFC 2183RFC 2616も参照)を使用することです。

たとえば、このnginx locationブロックは.txt/downloads/URIの下にファイルがあるこのようなヘッダーを送信するため、ダウンロードが強制されます。

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

そのため、構成に適した他の適切なマッチングなどを追加できます。


3
それが最善の解決策のようです。
ヴァディム

しかしContent-Disposition、クロムブラウザーのハックは、コンソールに悪い言葉を発し始め、ページからのファイルのダウンロードを停止することさえあります。これは、(黄色い三角形で)thinhgsを言うように:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

ダウンロード可能なファイルの場所を抽出し、コンテンツタイプをに設定する必要がありますapplication/octet-stream

ダウンロード可能なプロモーション資料のサービスには次の場所があります(pdf、画像、いくつかのドキュメントが含まれていますが、txtファイルでも動作するはずです)。

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

試したブラウザはすべて、表示しようとする代わりに、この場所からすべてのファイルをダウンロードします。


4
「add_header」を使用するのは絶対に間違っています。代わりに「default_type」を使用してください。location / smth / {default_type application / octet-stream ;; }
オレグノイミバキン

@OlegNeumyvakin default_typeがadd_headerよりも優れているのはなぜですか?
user193661

2
@ user193661「add_header」は新しいヘッダー「Content-Type」を追加するため、応答として、HTTPクライアントの奇妙な動作につながる可能性のある2つの「Content-Type」ヘッダーを取得できます。「default_type」は、応答で単一の「Content-Type」ヘッダーを設定(上書き)します。
オレグノイミバキン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.