web-dev-qa-db-ja.com

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

私はRailsアプリケーション(Redmine)を使用しています。これはNginxで動作します。添付ファイルをクリックすると、ブラウザ(Firefox、つまりChrome)からファイルをダウンロードするように求められます。ただし、txtをクリックすると-type attach私のブラウザはこのファイルをブラウザで開きます。

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

18
demas

Txt拡張子のデフォルトのタイプはtext/plainです。この動作は、mime.typesファイルに記述されています。 http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type または http://nginx.org/en/docs/http/ngx_http_core_module.html#を使用しますタイプ オーバーライドします(おそらくapplication/octet-streamに設定されます)。

10
Vadim

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

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

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

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

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

20
daveadams

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

ダウンロード可能な販促資料(PDF、画像、一部のドキュメントが含まれますが、txtファイルでも動作するはずです)のサービスには、次の場所があります。

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

私たちが試みたすべてのブラウザは、それらを表示するのではなく、この場所からすべてのファイルをダウンロードします。

4
rvs