如何确保Nginx将纯文本文件作为下载而不是内联提供?


18

我有可以与Nginx一起使用的Rails应用程序(Redmine)。如果我单击任何附件,我的浏览器(firefox,即chrome)要求我下载文件。但是,如果我单击txt类型的附件,我的浏览器会在浏览器中打开该文件。

据我了解,Nginx的任务是决定-在浏览器中打开文件还是下载文件。如何设置?

Answers:



20

更改Content-Type.txt文件可以正常工作,但它是解决这个问题的一个很危险的方式,因为你不能保证100%,用户的浏览器会回应你如何期望。而且,将.txt文件标记为二进制文件具有误导性。

相反,我建议使用标准方法来强制浏览器下载而不是显示文件,即使用Content-Disposition具有attachmentRFC 2183,另请参见RFC 2616)值的标头。

例如,此nginx location块将使用URI .txt下的文件向下发送此类标头,/downloads/因此将被迫下载:

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

因此,您可以添加其他适合您的配置的匹配项等。


3
这似乎是最好的解决方案。
瓦迪姆

但是Content-DispositionChrome浏览器中的骇客可能会开始向控制台说脏话,甚至停止从页面下载任何文件。它说:Thinhgs(带有黄色三角形),例如:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

您需要提取可下载文件的位置,并将其内容类型设置为application/octet-stream

我们在服务的以下位置提供了可下载的宣传资料(包括pdf,图像和一些docs,但我确定它也可以与txt文件一起使用):

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

我们尝试的每种浏览器都从该位置下载所有文件,而不是尝试显示它们。


4
使用“ add_header”是绝对错误的,请改用“ default_type”:location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin为什么default_type比add_header更好?
user193661

2
@ user193661因为“ add_header”随即添加了新的标头“ Content-Type”,所以作为响应,您可以获得两个“ Content-Type”标头,这可能导致HTTP客户端的异常行为。作为响应,“ default_type”设置(覆盖)单个“ Content-Type”标头。
Oleg Neumyvakin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.